Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/387.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 带Null的列表的加权顺序_Java_Arraylist_Null_Comparator - Fatal编程技术网

Java 带Null的列表的加权顺序

Java 带Null的列表的加权顺序,java,arraylist,null,comparator,Java,Arraylist,Null,Comparator,我一直在尝试实现一个Comparator类,它应该根据位置的权重对列表进行排序。我会解释我应该完成什么 假设我有一个ArrayList。此数组列表始终具有固定大小,用null值填充其他插槽 //固定大小=3 T-myObj1,myObj2; [myObj1,null,myObj2]; 在本例中,myObj20 if (one == null && two == null) { return 0; } else if (two == null) { return

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

假设我有一个
ArrayList
。此数组列表始终具有固定大小,用
null
值填充其他插槽

//固定大小=3
T-myObj1,myObj2;
[myObj1,null,myObj2];
在本例中,
myObj2
,因为它存储在位置值小于第一个的插槽中

排序比较器应给出以下输出:

//固定大小=3
T-myObj1,myObj2;
[myObj1,myObj2,null];
其他例子:

//固定大小=7;
T myObj1,myObj2,myObj3,myObj4;
输入=[myObj1,null,null,myObj4,myObj3,myObj2,null];
结果=[myObj1,myObj4,myObj3,myObj2,null,null,null];

我考虑使用一个
比较器
(T是一个特定的类,实际上不需要是通用的);有没有办法复制这种行为?

在比较器中总是可以使null返回>0

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

这说明空值比非空值“大”

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

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

这意味着空值比非空值“大”

对于任何需要的人,我都是通过@tomgeraghty3来解决的

公共类TComparator实现Comparator{
公共整数比较(T r1,T r2){
如果(r1==null&&r2==null){
返回0;
}else if(r2==null){
返回-1;
}if(r1==null){
返回1;
}否则{
返回1;
}
}
}

对于任何需要帮助的人,多亏了@tomgeraghty3,我才找到了答案

公共类TComparator实现Comparator{
公共整数比较(T r1,T r2){
如果(r1==null&&r2==null){
返回0;
}else if(r2==null){
返回-1;
}if(r1==null){
返回1;
}否则{
返回1;
}
}
}

与编写自己的比较器逻辑不同,通常更简单的方法是使用一种辅助方法,例如

>List foo=Arrays.asList(1,null,2,null,1,null);
>Collections.sort(foo,Comparator.comparing(x->x==null?1:0));
>福
[1,2,1,null,null,null]
通过这种方式,排序就像非空元素都是0,空值都是1一样,因此在排序时,空值将出现在非空值之后。非null元素将保持其原始顺序,因为它是稳定的

对于@Zabuza所指出的这种特殊情况,helper方法做的事情完全正确;该参数为
null
,因为我们不希望对非null元素使用“回退”比较器

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

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

与其编写自己的比较器逻辑,不如使用以下帮助器方法之一:

>List foo=Arrays.asList(1,null,2,null,1,null);
>Collections.sort(foo,Comparator.comparing(x->x==null?1:0));
>福
[1,2,1,null,null,null]
通过这种方式,排序就像非空元素都是0,空值都是1一样,因此在排序时,空值将出现在非空值之后。非null元素将保持其原始顺序,因为它是稳定的

对于@Zabuza所指出的这种特殊情况,helper方法做的事情完全正确;该参数为
null
,因为我们不希望对非null元素使用“回退”比较器

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

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

我将在我的比较器中尝试此方法!问题在于跟踪数组列表中已经存在的顺序(在第二个示例中
myObj1>myObj4
,因为它出现在第一个位置,而obj4出现在第四个位置)。编辑:我找到了nvm。请注意,您可以使用
Comparator.nullsFirst(…)
(或
nullsLast(…)
)设置快捷方式。我将在我的Comparator中尝试此操作!问题在于跟踪数组列表中已经存在的顺序(在第二个示例中
myObj1>myObj4
,因为它出现在第一个位置,而obj4出现在第四个位置)。编辑:我找到了nvm。请注意,您可以使用
Comparator.nullsFirst(…)
(或
nullsLast(…)
)。请注意,有
比较器。nullsFirst(…)
nullsLast(…)
。请注意,有
比较器。nullsFirst(…)
nullsLast(…)