Java实现IntegerList类findMedian方法报错,求正确实现及优化方案
代码无法运行的核心原因
- 编译层面错误:同一份Java源文件中不能存在两个public修饰的类,当前IntegerList和Main都加了public,编译直接失败,无法运行。
- 逻辑缺失:findMedian方法没有实现任何中位数计算逻辑,直接硬编码返回0,不可能得到正确结果。
- 设计冗余:需求要求findMedian方法操作当前IntegerList实例自身的list属性,不需要额外传入Vector参数,当前方法的入参属于多余设计。
符合需求的修改方案
调整后代码如下:
import java.util.Vector; import java.util.Collections; public class IntegerList { Vector<Integer> list = new Vector<>(); public int findMedian() { // 空列表抛出指定异常 if (list.isEmpty()) { throw new IllegalArgumentException(); } // 拷贝原列表排序,避免修改原列表的元素顺序 Vector<Integer> sortedList = new Vector<>(list); Collections.sort(sortedList); // 按需求规则取值,完全匹配题目给出的示例结果 return sortedList.get(sortedList.size() / 2); } } // 同文件下的非public类,解决编译冲突 class Main { public static void main(String[] args) { IntegerList v = new IntegerList(); v.list.add(2); v.list.add(3); v.list.add(4); v.list.add(9); // 直接调用实例方法,无需传参 System.out.println(v.findMedian()); } }
调整说明:
- 移除了Main类的public修饰符,解决同文件多public类的编译错误。
- 去掉findMedian方法的入参,直接操作实例自身的list属性,符合需求设计要求。
- 新增排序逻辑,拷贝原列表排序避免修改原数据,排序后取
size/2位置的元素,完全匹配题目给出的两个示例的结果要求。 - 保留空列表判断逻辑,符合异常抛出要求。
更优实现方案
- 集合替换:如果没有多线程使用场景,Vector可以替换为ArrayList,Vector所有方法默认加同步锁,单线程场景下性能更低。
- 算法优化:当前排序实现的时间复杂度是O(nlogn),如果处理的列表量级很大,可以用快速选择算法替换,平均时间复杂度降到O(n),不需要全量排序就能找到目标位置的元素。
内容的提问来源于stack exchange,提问作者Tomasz
相关产品推荐
相关产品推荐

