Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/366.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 集合排序_Java_Sorting_Collections - Fatal编程技术网

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".
    }
};