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(…)
。