我一直在尝试实现一个Comparator
类,它应该根据位置的权重对列表进行排序。我将解释我应该完成的任务。
假设我有一个ArrayList<T>
。这个数组列表总是有一个固定的大小,用null
值填充其他位置。
//fixed size = 3
T myObj1, myObj2;
[myObj1, null, myObj2];
在本例中为myObj2 < myObj1
,因为它存储在位置值小于第一个值的槽中。
排序比较器应提供以下输出:
//fixed size = 3
T myObj1, myObj2;
[myObj1, myObj2, null];
其他示例:
//fixed size = 7;
T myObj1, myObj2, myObj3, myObj4;
INPUT = [myObj1, null, null, myObj4, myObj3, myObj2, null];
RESULT = [myObj1, myObj4, myObj3, myObj2, null, null, null];
我考虑过使用Comparator<T>
(T是一个特定的类,实际上它不需要是通用的);有没有办法复制这样的行为?
发布于 2020-02-04 15:23:07
在比较器中,您总是可以使空值返回>0
if (one == null && two == null) {
return 0;
} else if (two == null) {
return -1;
} if (one == null) {
return 1;
} else {
//Compare logic...
}
这表示空值比非空值“大”。
发布于 2020-02-04 15:57:25
与编写自己的比较器逻辑相比,使用Comparator.comparing
之类的帮助器方法通常更简单。
> List<Integer> foo = Arrays.asList(1, null, 2, null, 1, null);
> Collections.sort(foo, Comparator.comparing(x -> x == null ? 1 : 0));
> foo
[1, 2, 1, null, null, null]
这样,排序就好像非空元素都是0,空值是1一样,所以当非空值排序时,空值将出现在非空值之后。非空元素将保持其原始顺序,因为Collections.sort
是稳定的。
正如@Zabuza所指出的,对于这个特定的情况,帮助方法Comparator.nullsLast
做了正确的事情;参数是null
,因为我们不想对非null元素使用“回退”比较器。
> Collections.sort(foo, Comparator.nullsLast(null));
也就是说,对于长度为n的列表,这种解决方案需要O(n log n)时间,而两指针解决方案可以在O(n)时间内解决相同的问题。
发布于 2020-02-04 15:49:55
感谢@tomgeraghty3,对于任何需要帮助的人,我都想通了
public class TComparator implements Comparator<T> {
public int compare(T r1, T r2) {
if (r1 == null && r2 == null) {
return 0;
} else if (r2 == null) {
return -1;
} if (r1 == null) {
return 1;
} else {
return 1;
}
}
}
https://stackoverflow.com/questions/60060439
复制相似问题