实现Comparable接口按表面积排序AWT Rectangle时Collections.sort报错如何解决
报错根本原因
- 接口类型不匹配:你调用的
Collections.sort(List<T> list, Comparator<? super T> c)重载方法要求第二个参数必须实现Comparator接口,但你自定义的SortBySurfaceArea类实现的是Comparable接口,类型不匹配导致参数转换失败。 - 接口使用场景混淆:
Comparable接口是给待排序的元素所属类实现的,代表该类的实例自身支持和同类型对象比较,对应无第二个参数的Collections.sort(List<T> list)方法;而你要排序的是系统自带的java.awt.Rectangle类,无法修改其源码实现自定义比较规则,这种场景必须用Comparator接口实现外部独立比较器,作为参数传入sort方法。 - 比较逻辑错误:你当前写的
compareTo方法仅返回了参数对象的面积值,没有对两个待比较的矩形面积做对比,也不符合比较方法要求返回「负数/0/正数分别代表前者小于/等于/大于后者」的规则。
修复方案
方案1:修改自定义比较器类
将SortBySurfaceArea改为实现Comparator<Rectangle>接口,实现正确的比较逻辑:
import java.awt.Rectangle; import java.util.Comparator; public class SortBySurfaceArea implements Comparator<Rectangle> { @Override public int compare(Rectangle r1, Rectangle r2) { // 转long计算避免int相乘溢出 long areaR1 = (long) r1.width * r1.height; long areaR2 = (long) r2.width * r2.height; // 按面积升序排序,如需降序改为Long.compare(areaR2, areaR1) return Long.compare(areaR1, areaR2); } }
修改后原有调用代码Collections.sort(rectangleList, new SortBySurfaceArea())即可正常运行。
方案2:Lambda简化写法(Java 8+支持,无需单独写比较器类)
直接在排序处写比较逻辑,不用单独创建SortBySurfaceArea类:
// 写法1:Lambda表达式传入Collections.sort Collections.sort(rectangleList, (r1, r2) -> Long.compare((long) r1.width * r1.height, (long) r2.width * r2.height)); // 写法2:调用List自带的sort方法 + Comparator工具类,更简洁 rectangleList.sort(Comparator.comparingLong(r -> (long) r.width * r.height));
内容的提问来源于stack exchange,提问作者online favourite
相关产品推荐
相关产品推荐

