如何对Number类型的ArrayList排序?现有代码仅该类型报错求助
问题原因
Collections.sort(List<T>)要求列表元素必须实现Comparable<? super T>接口,而Number作为Java的抽象基类,并没有实现该接口——这就是直接对ArrayList<Number>调用该方法会报错的核心原因。而Integer、Double等Number的子类自身实现了Comparable,所以对它们的列表排序能正常运行。
解决办法
使用Collections.sort的重载方法Collections.sort(List<T>, Comparator<? super T>),通过自定义Comparator来定义Number类型的比较逻辑,无需依赖元素自身的Comparable实现。
基础实现(适用于多数场景)
通过将Number转换为double值进行比较,覆盖大多数常用Number子类(如Integer、Double、Long等)的排序需求:
public static void sort(ArrayList<Number> list) { // 用Lambda简化Comparator实现(Java 8+支持) Collections.sort(list, (num1, num2) -> Double.compare(num1.doubleValue(), num2.doubleValue())); // 调整输出格式,避免非整数类型用%d报错 for(Number n : list) { System.out.printf("[%s]", n); } System.out.println(); }
高精度优化实现(针对BigDecimal/BigInteger)
如果列表中包含BigDecimal、BigInteger这类需要精确比较的类型,可以在Comparator中添加类型判断,避免double转换的精度丢失:
public static void sort(ArrayList<Number> list) { Collections.sort(list, new Comparator<Number>() { @Override public int compare(Number num1, Number num2) { if (num1 instanceof BigDecimal && num2 instanceof BigDecimal) { return ((BigDecimal) num1).compareTo((BigDecimal) num2); } if (num1 instanceof BigInteger && num2 instanceof BigInteger) { return ((BigInteger) num1).compareTo((BigInteger) num2); } // 其他类型转double比较 double val1 = num1.doubleValue(); double val2 = num2.doubleValue(); return Double.compare(val1, val2); } }); for(Number n : list) { System.out.printf("[%s]", n); } System.out.println(); }
内容的提问来源于stack exchange,提问作者Diavel
相关产品推荐
相关产品推荐

