import java.math.BigDecimal;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collections;
import java.util.List;public class AlgorithmUtil {/*** 求四分位距** @param param* @return*/public static double fourDivsion(double[] param) {// 转成BigDecimal类型,避免失去精度BigDecimal[] datas = new BigDecimal[param.length];for (int i = 0; i < param.length; i++) {datas[i] = BigDecimal.valueOf(param[i]);}int len = datas.length;// 数组长度Arrays.sort(datas);    // 数组排序,从小到大BigDecimal q1 = null;  // 第一四分位BigDecimal q2 = null;  // 第二四分位BigDecimal q3 = null;  // 第三四分位double index = 0; // 记录下标int indexInt=0;index = new BigDecimal(len-1).divide(new BigDecimal("4")).doubleValue();indexInt = new BigDecimal(len-1).divide(new BigDecimal("4")).intValue();//判断是否可以整除boolean bQ1 = strivesForTheRemainder(new BigDecimal(index));//可整除取当前数字if(bQ1){q1 = datas[indexInt];}else{//不可整除取小数位数字判断与1更靠近的位置String s = String.valueOf(index);s = s.substring ( s.indexOf ( "." ) );s ="0"+s;double v = Double.parseDouble(s);String bfb ="";if(v<0.5){bfb="0.25";q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}else if(v>0.5){bfb="0.75";q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}else{bfb="0.5";q1 = datas[indexInt+1].subtract(datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}}index = new BigDecimal(3 * (len - 1)).divide(new BigDecimal("4")).doubleValue();indexInt = new BigDecimal(3 * (len - 1)).divide(new BigDecimal("4")).intValue();//判断是否可以整除boolean bQ3 = strivesForTheRemainder(new BigDecimal(index));if(bQ3){q3 = datas[indexInt];}else{String s = String.valueOf(index);s = s.substring ( s.indexOf ( "." ) );s ="0"+s;double v = Double.parseDouble(s);String bfb ="";if(v<0.5){bfb="0.25";q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}else if(v>0.5){bfb="0.75";q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}else{bfb="0.5";q3 = datas[indexInt+1].subtract( datas[indexInt]).multiply(new BigDecimal(bfb)).add( datas[indexInt]);}}BigDecimal subtract = q3.subtract(q1);BigDecimal ys =new BigDecimal(0.7413);BigDecimal multiply = subtract.multiply(ys);return multiply.doubleValue();}/*** 求一个BigDecimal类型的数字的小数点后面的数,判断该数字能否整除1* false:有小数,不能整除* true:没有小数是整数,可以整除** @param bigDecimal* @return*/public static boolean strivesForTheRemainder(BigDecimal bigDecimal) {String str = bigDecimal.toString();boolean contains = str.contains(".");if (contains) {int index = str.indexOf(".");String substring = str.substring(index + 1);int decimals = Integer.parseInt(substring);if (decimals > 0) {return false;}return true;}return true;}/*** 求和** @param arr* @return*/public static double getSum(double[] arr) {double sum = 0;for (double num : arr) {sum += num;}return sum;}/*** 求均值** @param arr* @return*/public static double getMean(double[] arr) {return getSum(arr) / arr.length;}/*** 求均值待带保留位数  (指定值)** @param arr* @return*/public static double getMeanNew(double[] arr,int max) {double sum = getSum(arr);BigDecimal sumBig = BigDecimal.valueOf(sum);BigDecimal leng = BigDecimal.valueOf(arr.length);//采用四舍六入五成双BigDecimal divide = sumBig.divide(leng, max, BigDecimal.ROUND_HALF_EVEN);return divide.doubleValue();}/*** 求标准差* @param arr* @return*/public static double getStandardDevition(double[] arr) {double sum = 0;double mean = getMean(arr);for (int i = 0; i < arr.length; i++) {sum += (arr[i] - mean) * (arr[i] - mean);}return  Math.sqrt((sum / (arr.length - 1)));}/*** 求标准差  用保留位数的指定值做计算* @param* @return*/public static double getStandardDevition(double[] arr,double median) {double sum = 0;for (int i = 0; i < arr.length; i++) {sum += (arr[i] - median) * (arr[i] - median);}return  Math.sqrt((sum / (arr.length - 1)));}//保留小数一位public static double formatDouble1(double d) {// 新方法,如果不需要四舍五入,可以使用RoundingMode.DOWNBigDecimal bg = new BigDecimal(d).setScale(1, BigDecimal.ROUND_HALF_EVEN);return bg.doubleValue();}//求中位数public static double median(double[] arr) {List<Double> total = new ArrayList<Double>();for (int i = 0; i < arr.length; i++) {total.add(arr[i]);}double j = 0;//集合排序Collections.sort(total);int size = total.size();if(size % 2 == 1){j = total.get((size-1)/2);}else {//加0.0是为了把int转成double类型,否则除以2会算错j = (total.get(size/2-1) + total.get(size/2) + 0.0)/2;}return j;}//求保留指定位数的中位数public static double median(double[] arr,int max) {List<Double> total = new ArrayList<Double>();for (int i = 0; i < arr.length; i++) {total.add(arr[i]);}double j = 0;//集合排序Collections.sort(total);int size = total.size();if(size % 2 == 1){j = total.get((size-1)/2);BigDecimal mData = new BigDecimal(j).setScale(max, BigDecimal.ROUND_HALF_EVEN);return mData.doubleValue();}else {BigDecimal decimal = BigDecimal.valueOf(total.get(size / 2 - 1));BigDecimal decimal1 = BigDecimal.valueOf(total.get(size / 2));BigDecimal divide = decimal.add(decimal1).divide(BigDecimal.valueOf(2), max, BigDecimal.ROUND_HALF_EVEN);return divide.doubleValue();}}public static double ZeroFormat(double num,int n){BigDecimal bigDecimal=new BigDecimal(num);//DecimalFormat ff = new DecimalFormat("#.0000");  //保留四位小数//double result = Double.valueOf(ff.format(num));//return result;return bigDecimal.setScale(n, BigDecimal.ROUND_HALF_UP).doubleValue();//setscale(n,BigDecimal.ROUND_HALF_UP).doubleValue;}public static void main(String[] args) {//测试经典统计法,没有问题
/*      double[] temp1 = new double[]{14.3,15.4,15,15,15.5,16,16.2,12.5,15.9,13.2,15.5,13.7};double mean = getMean(temp1);//平均值double standardDevition = getStandardDevition(temp1);//标准差for (int i = 0; i <temp1.length ; i++) {double v = (temp1[i] - mean) / standardDevition;System.out.println(AlgorithmUtil.formatDouble1(v));}*///四分位距算法,没有问题
//        double[] temp1 = new double[]{0.0225, 0.0366, 0.0296, 0.0223, 0.0197, 0.0169,0.0216,0.0198,0.0260,0.0169,0.0216,0.0171,0.0150,0.0300,0.0245,0.0230,0.0184};//        double[] temp1 = new double[]{0.305,0.328,0.360,0.466,0.408,0.655,0.550,0.433,0.466,0.662,0.486,0.544,0.565,0.542,0.692,0.544};//        double[] temp1 = new double[]{22.2,22.5,21.0,22.4,22.0,21.3,22.4,22.3,22.4,20.5,21.3,20.9,22.4,22.2,21.0,22.4,20.6,20.7,20.8,20.9,20.1,20.7,26.3};//       double[] temp1 = new double[]{1,3,4,6,7,9,12,15,16,18,20,25,4,5};//        double[] temp1 = new double[]{2,5,7,9,10,13};//        double v =fourDivsion(temp1);//        boolean b = strivesForTheRemainder(new BigDecimal("40.01"));//        System.out.println(b);//        System.out.println(numberD);/*        double median = median(temp1);double v = fourDivsion(temp1);for (int i = 0; i <temp1.length ; i++) {double c = (temp1[i] - median) / v;System.out.println(AlgorithmUtil.formatDouble1(c));}*//*** 均值为 μ标准差σ的正态分布的具体实现* @param μ double型保留四位小数,表示正态分布均值* @param σ double型保留四位小数,表示正态分布标准差* @return S1 double型保留四位小数,表示p(X<x)的正态概率*/
/*        NormalDistribution normalDistributioin = new NormalDistribution(0,1);//新建一个标准正态分布对象Scanner in=new Scanner(System.in);do {System.out.println("请输入ц:");double ц=in.nextDouble();//ц=NumberFormat.ZeroFormat(ц);//对所得数据保留4位小数System.out.println("请输入σ:");double σ=in.nextDouble();//σ=NumberFormat.ZeroFormat(σ);    //对所得数据保留4位小数System.out.println("请输入x:");double x=in.nextDouble();//x=NumberFormat.ZeroFormat(x);//对所得数据保留4位小数double z=(x-ц)/σ;z=ZeroFormat(z,4);//对所得数据保留4位小数try {double S1 = normalDistributioin.cumulativeProbability(z);S1=ZeroFormat(S1,4);//对所得数据保留4位小数System.out.println("正态分布概率为:");System.out.println(S1);System.out.println();System.out.println("请问您还要继续输入吗?(1/0)");} catch (Exception e) {// 这里的异常为所得的结果过小导致异常,直接将结果自动置0System.out.println("正态分布概率为:");System.out.println("0");System.out.println();System.out.println("请问您还要继续输入吗?(1/0)");}} while (in.nextInt()==1);//while循环,当输入的值为1继续,为其他值则终止程序*/}}

java 四分位距算法和标准差相关推荐

  1. 分散性与变异性的度量——全距、四分位距、标准差、标准分

    平均数让我们看到一组数据的集中趋势,那么进一步了解数据的分布,也就是分散性与变异性则需要以下这些统计量. 一.全距 1.计算方法 全距=上界-下界 2.含义 全距表示一组数据的宽度,用极大值减去极小值 ...

  2. 【读书笔记->统计学】03-01 各种“距”和“差”-极差(全距)、四分位距(数)、百分位数、箱线图概念简介

    各种"距"和"差" 上一章中我们学习了平均数,但是它有自己的有限性.为了得到更多的信息,我们开始学习各种"距"和"差". ...

  3. Java 数据结构与算法系列之冒泡排序

    一.前言 相信大部分同学都已经学过数据结构与算法这门课了,并且我们可能都会发现一个现象就是我们所学过的数据结构与算法类的书籍基本都是使用 C 语言来写的,好像没见过使用 Java 写的数据结构与算法. ...

  4. Java数据结构与算法——树(基本概念,很重要)

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 有网友私信我,期待我的下一篇数据结构.非常荣幸文章被认可,也非常感谢你们的监督. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督 ...

  5. Java常见排序算法

    Java常见排序算法 转载于:https://www.cnblogs.com/hfultrastrong/p/7829889.html

  6. Java数据结构与算法——插入排序

    声明:码字不易,转载请注明出处,欢迎文章下方讨论交流. 前言:Java数据结构与算法专题会不定时更新,欢迎各位读者监督.本篇文章介绍排序算法中插入排序算法,包括插入排序的思路,适用场景,性能分析,ja ...

  7. JAVA版连连看算法研究

    JAVA连连看之算法: 连连看连接方式的类型:<?xml:namespace prefix = o ns = "urn:schemas-microsoft-com:office:off ...

  8. java 求交集 算法_Java计算交集,差集,并集的方法示例

    Java计算交集,差集,并集的方法示例 发布时间:2020-10-07 10:37:46 来源:脚本之家 阅读:106 作者:benbenkui 本文实例讲述了Java计算交集,差集,并集的方法.分享 ...

  9. Java数据结构和算法(六)——前缀、中缀、后缀表达式

    前面我们介绍了三种数据结构,第一种数组主要用作数据存储,但是后面的两种栈和队列我们说主要作为程序功能实现的辅助工具,其中在介绍栈时我们知道栈可以用来做单词逆序,匹配关键字符等等,那它还有别的什么功能吗 ...

最新文章

  1. Java项目:CRM客户关系管理系统(java+Springboot+maven+mysql)
  2. 说出你的个人知识问题!
  3. USB转串口 FT232/PL2303/CH340 驱动以及使用体会
  4. IIS 权限错误(401.1 401.2 401.3)解决办法
  5. Spring开启方法异步执行
  6. 小众即时通信工具专项整治启动,关停“比邻”“聊聊”“密语”等9款违法App...
  7. linux版高德导航软件下载,高德导航下载2021年最新版本_高德导航2021手机版下载-太平洋下载中心...
  8. IDEA翻译插件出现报错: 更新 TKK 失败,请检查网络连接解决
  9. 1908: 【18NOIP提高组】填数游戏
  10. GIthub上关于新冠肺炎数据整理的项目汇总
  11. 从魔兽世界论专业队友的重要性
  12. 怎么理解面向对象编程【java基础第一讲】
  13. 利用bat批处理做启动mongodb脚本
  14. My97时间插件使用、My97设置日期控件日期格式
  15. 支付开发(七)----支付宝开发之手机网站支付(H5支付)
  16. 增值税发票生成EXCEL——调用百度开发接口
  17. Firefox的模仿MyIE插件套餐
  18. Win11如何查看显卡功耗?
  19. Python 实验2.1
  20. ListView中插广告栏兼DoubleClick For Publishers (DFP) Banner Ads demo

热门文章

  1. linux rcs 应用程序,Linux下的rcS文件的一些分析
  2. Hibernate 多表映射(Mybatis,Springjdbc,Hibernate ,JDBC的多表映射学习比较)
  3. 7款产品解决宠物主人头痛的问题
  4. 1970-01-01是什么?为什么计算机起始时间是1970年1月1日
  5. 清华计算机系收自考本科生吗,成人高考可以考清华吗,成年人怎么样可以上清华北大?...
  6. Python基础学习第八天
  7. 图形图像学习随笔:计算机图形学的一些基本概念
  8. 解决告警“warning #1295-D Deprecated declaration xxxxxxx - give arg types”方法
  9. 项目管理的SDCA环、PDCA环
  10. jsc反编译工具编写探索之路