Java无序列表中位数计算出错:输出4而非3,求解决方案
问题分析与解决方案
你的猜测错误——排序后的列表是保持有序的,问题出在中位数的索引计算逻辑的易出错性上(或你实际运行的代码存在笔误)。
你的原代码中用Math.ceil(length / 2)计算索引,对于奇数长度的列表来说,理论上结果正确,但这种写法不够直观,容易引发混淆。更可靠的方式是根据列表长度的奇偶性直接定位中位数:
- 奇数长度的列表:中位数是排序后位于正中间的元素,对应0-based索引为
size / 2(整数除法,比如5/2=2) - 偶数长度的列表:通常取中间两个元素的平均值(若需返回整数可做取整处理)
修正后的代码
import java.util.ArrayList; import java.util.Collections; import java.util.List; public class MockTest1 { /* given a random list of integers, find the median e.g. given the list [1, 4, 2, 3, 5] the median is 3 */ public static void main(String[] args) { List<Integer> array = List.of(1, 3, 4, 5, 2); System.out.println(getMedian(array)); } public static int getMedian(List<Integer> arr) { ArrayList<Integer> list = new ArrayList<>(arr); Collections.sort(list); int size = list.size(); if (size % 2 == 1) { // 奇数长度,返回中间元素 return list.get(size / 2); } else { // 偶数长度,返回中间两个元素的平均值(取整) return (list.get(size/2 - 1) + list.get(size/2)) / 2; } } }
运行这段代码,输入列表[1,3,4,5,2]会输出预期的3。同时请确认代码中Collections.sort(list)确实执行,且排序后没有对列表进行其他修改操作,这是保证中位数计算正确的前提。
内容的提问来源于stack exchange,提问作者ben_11
相关产品推荐
相关产品推荐

