/**
*
* * @描述:集中趋势量数:计算中位数
* * @方法名: median
* * @param in
* * @return
* * @返回类型 double
* * @创建人 micheal
* * @创建时间 2019年1月2日下午10:45:33
* * @修改人 micheal
* * @修改时间 2019年1月2日下午10:45:33
* * @修改备注
* * @since
* * @throws
*
*/
public static double median(double[] in) {
if (in == null) {
throw new java.lang.NumberFormatException();
}
Arrays.sort(in);
// for (int i = 0; i < in.length; i++) {
// log.debug("sort: "+i+":::"+in[i]);
// }
if (in.length % 2 == 1) {
return in[(int) Math.floor(in.length / 2)];
} else {
double[] avg = new double[2];
avg[0] = in[(int) Math.floor(in.length / 2) - 1];
avg[1] = in[(int) Math.floor(in.length / 2)];
return mean(avg);
}
}
/**
*
* * @描述:集中趋势量数:计算众数
* * @方法名: mode
* * @param in
* * @return
* * @返回类型 List
* * @创建人 micheal
* * @创建时间 2019年1月2日下午10:45:42
* * @修改人 micheal
* * @修改时间 2019年1月2日下午10:45:42
* * @修改备注
* * @since
* * @throws
*
*/
public static List mode(double[] in) {
HashMap map = new HashMap();
double imode = 0;
for (int i = 0; i < in.length; i++) {
double x = in[i];
if (map.containsKey(String.valueOf(x))) {
// 如果出现多次,取出以前的计数,然后加1
int len = Integer.parseInt(map.get(String.valueOf(x)).toString());
map.put(String.valueOf(x), String.valueOf(len + 1));
imode = Math.max(imode, len + 1);
} else {
// 如果是第一次出现,计数为1
map.put(String.valueOf(x), String.valueOf(1));
imode = Math.max(imode, 1);
}
}
Iterator iter = map.keySet().iterator();
ArrayList lst = new ArrayList();
while (iter.hasNext()) {
Object key = iter.next();
Object v = map.get(key);
if (Integer.parseInt(v.toString()) == imode) {
lst.add(key);
}
}
return lst;
}
测试代码,打印结果,中位数:2.5:,众数:7.01
double[] in2 = { 2, 3, 1, 4 };
log.info("计算[中位数]:" + median(in2));
double[] in3 = { 2, 3, 5, 6, 6, 7, 7, 7, 7.01, 7.01, 7.01, 7.01, 8, 4 };
List lst = mode(in3);
for (int i = 0; i < lst.size(); i++) {
log.info("计算[众数]:" + lst.get(i));
}