[英]List within list Sorting issue in Java
我正在尝试对List<List<Integer>>
进行排序。 内部列表将有 3 个值。 (X 坐标、Y 坐标、开始/结束)现在虽然它适用于大多数情况,但对于特定情况,排序会失败。
我用于排序的代码是:
arr.sort((a,b) -> {
if(a.get(0)!=b.get(0)){
return a.get(0) - b.get(0);
}
else{
return (a.get(2)==0?-a.get(1):a.get(1)) - (b.get(2)==0?-b.get(1):b.get(1));
}
});
其背后的逻辑是:如果 x 值不相等,我们将根据 x 对它们进行排序。 如果相等,则:如果两者都以降序开始,则基于高度。 如果两者都以升序结束,则以高度为基础。 否则以开始为准。
开始显示为 0,结束显示为 1。
失败的例子是:arr:
[[1, 10000, 0], [10001, 10000, 1], [2, 9999, 0], [10001, 9999, 1]]
Output:
[[1, 10000, 0], [2, 9999, 0], [10001, 10000, 1], [10001, 9999, 1]]
而预期的排序是:
[[1, 10000, 0], [2, 9999, 0], [10001, 9999, 1], [10001, 10000, 1]]
你能帮我找出我做错了什么吗?
代码按预期工作。 由于在[10001, 9999, 1]
和[10001, 10000, 1]
之间进行比较的代码中,它将在else
语句中为 go 并且因为a.get(2)
和b.get(2)
都不是零, else
语句将简化为b.get(1) - a.get(1)
,按降序排列。 因此,它将按[10001, 10000, 1]
的顺序排序,然后是[10001, 9999, 1]
。
此外,不应使用==
或!=
运算符比较盒装整数 ( Integer
),因为它们将通过引用进行比较。 相反,应该使用equals
方法。
第二个 else 条件应该从 a 的 y 中减去 b 的 y。 像这样的东西:
(a,b) -> {
if(!a.get(0).equals(b.get(0))){
return a.get(0) - b.get(0);
}
else{
return (a.get(2).equals(0)?-a.get(1):a.get(1)) - (b.get(2).equals(0)?-b.get(1):b.get(1));
}
}
我认为原始排序代码很难阅读并且不符合您的期望。 我将其更改为:
public static void main(String[] args) {
List<List<Integer>> list = Arrays.asList(Arrays.asList(1, 10000, 0),
Arrays.asList(10001, 10000, 1), Arrays.asList(2, 9999, 0)
,Arrays.asList(10001, 9999, 1)
, Arrays.asList(10001, 9999, 0));
Collections.sort(list, (a,b) -> {
if(!a.get(0).equals(b.get(0))){
return a.get(0) - b.get(0);
}
else{
if (b.get(2).equals(a.get(2))) {
if (a.get(2) == 0) {
return Integer.compare(b.get(1), a.get(1)); //start, descending
} else {
return Integer.compare(a.get(1), b.get(1)); // ascending
}
} else {
return a.get(2) == 0 ? -1 : 1; // 0 first
}
}
});
System.out.println(list); // [[1, 10000, 0], [2, 9999, 0], [10001, 9999, 0], [10001, 9999, 1], [10001, 10000, 1]]
}
希望能帮助到你
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.