Java 集合排序
我有一个代码,用于排序值的比较器:Java 集合排序,java,sorting,collections,Java,Sorting,Collections,我有一个代码,用于排序值的比较器: public static Comparator<Partikel> getFFsorted() { Comparator comp = new Comparator<Partikel>() { @Override public int compare(Partikel s1, Partikel s2) { if(s1.ff>s2.ff) {
public static Comparator<Partikel> getFFsorted() {
Comparator comp = new Comparator<Partikel>() {
@Override
public int compare(Partikel s1, Partikel s2) {
if(s1.ff>s2.ff)
{
return 1;
}
else
{
return -1;
}
}
};
return comp;
}
公共静态比较器getFFsorted(){
比较器comp=新比较器(){
@凌驾
公共整数比较(Partikel s1,Partikel s2){
如果(s1.ff>s2.ff)
{
返回1;
}
其他的
{
返回-1;
}
}
};
返回补偿;
}
但我有这样一个错误:
线程“main”java.lang.IllegalArgumentException中的异常:
比较法违反其总合同!在
java.util.TimSort.mergeHi(TimSort.java:868)
位于java.util.TimSort.mergeAt(TimSort.java:485)
位于java.util.TimSort.mergeCollapse(TimSort.java:410)
位于java.util.TimSort.sort(TimSort.java:214)
位于java.util.TimSort.sort(TimSort.java:173)
位于java.util.Arrays.sort(Arrays.java:659)
位于java.util.Collections.sort(Collections.java:217)
如何修复它?您的方法无法处理equal
ff
的情况
因此,compare(s1,s2)
和compare(s2,s1)
在s1.ff==s2.ff
时都将返回-1。这违反了compare
的约定,该约定要求所有x和y的sgn(compare(x,y))==-sgn(compare(y,x))
public int compare(Partikel s1, Partikel s2) {
if(s1.ff > s2.ff) {
return 1;
} else if (s1.ff < s2.ff) {
return -1;
} else {
return 0;
}
}
public int比较(Partikel s1,Partikel s2){
如果(s1.ff>s2.ff){
返回1;
}否则如果(s1.ff
Partikel类中的ff成员在我看来像是数字
因此,最好从包装器类实现静态方法
比如:
@Override
public int compare(Partikel p1.ff, Partikel p2) {
return Integer.compare(p1.ff, p2.ff);
//or
return Double.compare(p1.ff, p2.ff);
//or
return Long.compare(p1.ff, p2.ff);
//or
return Float.compare(p1.ff, p2.ff);
}
如果比较器中有任何NaN值,就会发生这种情况
例如:
public class Demo
{
public static void main(String[] args) {
double a = Double.NaN;
double b = Double.NaN;
System.out.println(a < b);
System.out.println(a > b);
因为你只取了两个,所以试着按如下方式分为三个:
public int compare(Partikel s1, Partikel s2) {
if(s1.ff>s2.ff)
return 1;
else if(s1.ff<s2.ff)
return -1;
//for equality
else
return 0;
}
public int比较(Partikel s1,Partikel s2){
如果(s1.ff>s2.ff)
返回1;
否则,如果(s1.ff您不处理值相等的情况
Java具有内置函数,可以正确比较包装器类中每个基本数据类型(整型、长型、浮点型、双精度等)的基本数据类型,您可以使用:
Comparator comp = new Comparator<Partikel>() {
@Override
public int compare(Partikel s1, Partikel s2) {
return Integer.compare(s1.ff, f2.ff);
// Or Long.compare, Float.compare, Double.compare, etc.
// depending on the datatype of the field "ff".
}
};
比较器comp=新比较器(){
@凌驾
公共整数比较(Partikel s1,Partikel s2){
返回整数。比较(s1.ff,f2.ff);
//或Long.compare、Float.compare、Double.compare等。
//取决于字段“ff”的数据类型。
}
};
“比较法违反了它的一般约定!”当你把它和你的代码进行比较时,没有什么东西跳出来?没有什么东西是整数.NaN
-只有浮点.NaN
和双精度.NaN
。
Comparator comp = new Comparator<Partikel>() {
@Override
public int compare(Partikel s1, Partikel s2) {
return Integer.compare(s1.ff, f2.ff);
// Or Long.compare, Float.compare, Double.compare, etc.
// depending on the datatype of the field "ff".
}
};