首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >具有空值的列表的加权顺序

具有空值的列表的加权顺序
EN

Stack Overflow用户
提问于 2020-02-04 23:19:56
回答 3查看 44关注 0票数 0

我一直在尝试实现一个Comparator类,它应该根据位置的权重对列表进行排序。我将解释我应该完成的任务。

假设我有一个ArrayList<T>。这个数组列表总是有一个固定的大小,用null值填充其他位置。

代码语言:javascript
运行
复制
//fixed size = 3
T myObj1, myObj2;
[myObj1, null, myObj2];

在本例中为myObj2 < myObj1,因为它存储在位置值小于第一个值的槽中。

排序比较器应提供以下输出:

代码语言:javascript
运行
复制
//fixed size = 3
T myObj1, myObj2;
[myObj1, myObj2, null];

其他示例:

代码语言:javascript
运行
复制
//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是一个特定的类,实际上它不需要是通用的);有没有办法复制这样的行为?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2020-02-04 23:23:07

在比较器中,您总是可以使空值返回>0

代码语言:javascript
运行
复制
if (one == null && two == null) {
    return 0;
} else if (two == null) {
    return -1;
} if (one == null) {
    return 1;
} else {
   //Compare logic...
}

这表示空值比非空值“大”。

票数 1
EN

Stack Overflow用户

发布于 2020-02-04 23:57:25

与编写自己的比较器逻辑相比,使用Comparator.comparing之类的帮助器方法通常更简单。

代码语言:javascript
运行
复制
> 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元素使用“回退”比较器。

代码语言:javascript
运行
复制
> Collections.sort(foo, Comparator.nullsLast(null));

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

票数 1
EN

Stack Overflow用户

发布于 2020-02-04 23:49:55

感谢@tomgeraghty3,对于任何需要帮助的人,我都想通了

代码语言:javascript
运行
复制
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;
        }
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60060439

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档