【发布时间】:2015-11-23 15:13:19
【问题描述】:
我有以下课程-
public class Pair
{
public double value;
int id;
Pair(){
value=0;
id=0;
}
Pair(double value, int id){
this.value=value;
this.id=id;
}
}
用于实现 Comparator 类的 PairComparator 类
public class PairComparator implements Comparator<Pair>{
@Override
public int compare(Pair p1, Pair p2){
return (int)(p2.value-p1.value);
}
}
我正在尝试按如下方式对 Pair 集合进行排序-
List<Pair> list= new ArrayList<Pair>();
list.add(new Pair(5.2, 4));
list.add(new Pair(3.4, 5));
list.add(new Pair(10.3, 3));
Collections.sort(list, new PairComparator());
但是我遇到了以下错误-
`线程“main”java.lang.IllegalArgumentException 中的异常:比较方法违反了它的一般约定!
Exception in thread "main" java.lang.IllegalArgumentException: Comparison method violates its general contract!
at java.util.TimSort.mergeHi(TimSort.java:895)
at java.util.TimSort.mergeAt(TimSort.java:512)
at java.util.TimSort.mergeCollapse(TimSort.java:435)
at java.util.TimSort.sort(TimSort.java:241)
at java.util.Arrays.sort(Arrays.java:1512)
at java.util.ArrayList.sort(ArrayList.java:1454)
at java.util.Collections.sort(Collections.java:175)
at com.research.priyanshuid.recommendation_system.MatrixRecalculation.main(MatrixRecalculation.java:59)
【问题讨论】:
-
@MadushanPerera 我没有完全插入上面代码中的列表项,您是否认为代码可能由于数据问题而产生错误?
-
否,如果你没有提供它应该编译和运行良好但没有任何输出的列表项。
-
我的意思是我的列表中有数据,但它没有按照上面列表中的方式插入,那么比较器类是否可能由于数据类型的不兼容而出现此特定错误?
-
数据类型不兼容会立即给您一个编译错误,因为您不能将字符串值作为
Pair类构造函数的第一个参数传递。 -
“没有按照上面列表中的方式插入”所以你是用哪种方式插入的???
标签: java sorting collections