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)));