Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.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 按两个参数进行的自定义排序工作不正常 公共列表演示[][]建筑物{ 列表跟踪器=新的ArrayList; int指针=0; 对于int i=0;i{ 如果a.get0!=b.get0{ 返回a.get0.compareTob.get0; }否则{ 返回a.get1.compareTob.get1; } }; 返回跟踪器; }_Java_List_Sorting_Collections - Fatal编程技术网

Java 按两个参数进行的自定义排序工作不正常 公共列表演示[][]建筑物{ 列表跟踪器=新的ArrayList; int指针=0; 对于int i=0;i{ 如果a.get0!=b.get0{ 返回a.get0.compareTob.get0; }否则{ 返回a.get1.compareTob.get1; } }; 返回跟踪器; }

Java 按两个参数进行的自定义排序工作不正常 公共列表演示[][]建筑物{ 列表跟踪器=新的ArrayList; int指针=0; 对于int i=0;i{ 如果a.get0!=b.get0{ 返回a.get0.compareTob.get0; }否则{ 返回a.get1.compareTob.get1; } }; 返回跟踪器; },java,list,sorting,collections,Java,List,Sorting,Collections,当我输入: [[1,10001,10000],[2,10001,9999],[3,10001,9998]] 我得到的结果是: [[1,-10000],[2,-9999],[3,-9998],[10001,10000],[10001,9999],[10001,9998]] 这不是我所期望的输出,因为我的排序规则应该是当10001==10001时,那么应该首先安排具有较小秒坐标的排序。我认为问题在于整数缓存。对于较小的数字,整数被缓存,因此!=作品对于较大的数字,使用新的整数。使用Integer

当我输入:

[[1,10001,10000],[2,10001,9999],[3,10001,9998]]
我得到的结果是:

[[1,-10000],[2,-9999],[3,-9998],[10001,10000],[10001,9999],[10001,9998]]

这不是我所期望的输出,因为我的排序规则应该是当10001==10001时,那么应该首先安排具有较小秒坐标的排序。

我认为问题在于整数缓存。对于较小的数字,整数被缓存,因此!=作品对于较大的数字,使用新的整数。使用Integer.equals检查是否相等

更改:

if(a.get(0) != b.get(0))
进入:

否则,您将比较引用而不是值

另一种方法是使用Comparator类的helper方法

Comparator.<List<Integer>>comparing( list -> list.get(0) ).thenComparing(list-> list.get(1) );

我认为问题在于整数缓存。对于较小的数字,整数被缓存,因此!=作品对于较大的数字,使用新的整数。使用Integer.equals检查是否相等

更改:

if(a.get(0) != b.get(0))
进入:

否则,您将比较引用而不是值

另一种方法是使用Comparator类的helper方法

Comparator.<List<Integer>>comparing( list -> list.get(0) ).thenComparing(list-> list.get(1) );
这是正确的

这里有另一种解决方法。不要两次比较值,即不要同时使用equals和compareTo:

Collections.sorttracker,a,b->{ int cmp=a.get0.compareTob.get0; 如果cmp==0{ cmp=a.get1.compareTob.get1; } 返回cmp; } ; 更简单的解决方案:

Collections.sorttracker,Comparator.comparingx->x.get0 .然后比较x->x.get1; 根据编译器的版本,可能需要提示才能知道x是什么。这两种方法中的任何一种都应该做到这一点,两者都不比另一种好

Collections.sorttracker,Comparator.comparingx->x.get0 .然后比较x->x.get1; Collections.sorttracker,Comparator.comparingList x->x.get0 .然后比较x->x.get1; 这是正确的

这里有另一种解决方法。不要两次比较值,即不要同时使用equals和compareTo:

Collections.sorttracker,a,b->{ int cmp=a.get0.compareTob.get0; 如果cmp==0{ cmp=a.get1.compareTob.get1; } 返回cmp; } ; 更简单的解决方案:

Collections.sorttracker,Comparator.comparingx->x.get0 .然后比较x->x.get1; 根据编译器的版本,可能需要提示才能知道x是什么。这两种方法中的任何一种都应该做到这一点,两者都不比另一种好

Collections.sorttracker,Comparator.comparingx->x.get0 .然后比较x->x.get1; Collections.sorttracker,Comparator.comparingList x->x.get0 .然后比较x->x.get1;
在Java中比较对象时,始终使用equals或compareTo

而不是:

   if(a.get(0) != b.get(0)){ // <---- THIS IS WRONG
        return a.get(0).compareTo(b.get(0));
    }
即:

    int result = a.get(0).compareTo(b.get(0));
    return result == 0 ? a.get(1).compareTo(b.get(1)) : result;
此外,您可以简单地使用tracker.sort代替Collection.sort,并用比较器链替换比较逻辑:

tracker.sort(Comparator.comparingInt((List<Integer> a) -> a.get(0))
                       .thenComparingInt(a -> a.get(1)));

在Java中比较对象时,始终使用equals或compareTo

而不是:

   if(a.get(0) != b.get(0)){ // <---- THIS IS WRONG
        return a.get(0).compareTo(b.get(0));
    }
即:

    int result = a.get(0).compareTo(b.get(0));
    return result == 0 ? a.get(1).compareTo(b.get(1)) : result;
此外,您可以简单地使用tracker.sort代替Collection.sort,并用比较器链替换比较逻辑:

tracker.sort(Comparator.comparingInt((List<Integer> a) -> a.get(0))
                       .thenComparingInt(a -> a.get(1)));