列表的加权顺序与空



我一直在尝试实现一个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是一个特定的类,实际上不需要是通用的(;有没有办法复制这种行为?

您始终可以在比较器中使空值返回> 0

if (one == null && two == null) {
return 0;
} else if (two == null) {
return -1;
} if (one == null) {
return 1;
} else {
//Compare logic...
}

这表示空值比非空值"大"

与其编写自己的比较器逻辑,不如使用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,因为没有我们想要用于非空元素的"回退"比较器。

> Collections.sort(foo, Comparator.nullsLast(null));

也就是说,对于长度为 n 的列表,此解决方案需要 O(n log n( 时间,而双指针解决方案可以在 O(n( 时间内解决相同的问题。

对于任何有需要的人,我都想通了,这要归功于@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;
}
}
}

相关内容

  • 没有找到相关文章

最新更新