Java - BigDecimal计算中位数
日常开发中,如果使用数据库来直接查询一组数据的中位数,就比较简单,直接使用对应的函数就可以了,例如:
SUBSTRING_INDEX(SUBSTRING_INDEX(GROUP_CONCAT(目标列名 ORDER BY 目标列名),',',Count(1)/2),',',-1) AS 目标列名_median
如果是需要再代码逻辑部分进行中位数的计算,就需要我们自己写一个工具类来支持计算了
import org.springframework.util.CollectionUtils;public static BigDecimal getMedian (List<BigDecimal> dataList) {if (CollectionUtils.isEmpty(dataList)) {return BigDecimal.ZERO;}//升序排序dataList = dataList.stream().sorted().collect(Collectors.toList());//生成中位数BigDecimal median;if (dataList.size() % 2 == 0) {median = (dataList.get(dataList.size() / 2 - 1).add(dataList.get(dataList.size() / 2))).divide(new BigDecimal(2));} else {median = dataList.get(dataList.size() / 2);}return median;}
public static void main(String[] args) {ArrayList<BigDecimal> dataList1 = com.google.common.collect.Lists.newArrayList(new BigDecimal("0.200010009"), new BigDecimal("0.300010009"), new BigDecimal("0.400010009"), new BigDecimal("0.500010009"), new BigDecimal("0.600010009"));System.out.println("dataList1_median: "+getMedian(dataList1));ArrayList<BigDecimal> dataList2 = com.google.common.collect.Lists.newArrayList(new BigDecimal("0.200010009"), new BigDecimal("0.300010009"), new BigDecimal("0.400010009"), new BigDecimal("0.500010009"));System.out.println("dataList2_median: "+getMedian(dataList2));}Console:
dataList1_median: 0.400010009
dataList2_median: 0.350010009
一些大的工具类库应该是有支持这种计算的,但我还是想自己在本地写一个工具方法,毕竟到时候万一有问题改起来不是灵活一点么