Java 了解对集合排序时的比较方法
我有以下代码对具有label属性的项目集合进行排序:Java 了解对集合排序时的比较方法,java,sorting,comparison,comparator,Java,Sorting,Comparison,Comparator,我有以下代码对具有label属性的项目集合进行排序: Collections.sort(myList, new Comparator<ListItem>() { @Override public int compare(ListItem lhs, ListItem rhs) { Crashlytics.log(Log.DEBUG, TAG, "lhs.getLabel(): " + lhs.getLabe
Collections.sort(myList, new Comparator<ListItem>() {
@Override
public int compare(ListItem lhs, ListItem rhs) {
Crashlytics.log(Log.DEBUG, TAG, "lhs.getLabel(): " + lhs.getLabel() + " | rhs.getLabel(): " + rhs.getLabel());
if (lhs.getLabel() == null || rhs.getLabel() == null) {
return 0;
}
return lhs.getLabel().compareTo(rhs.getLabel());
}
});
我理解这与比较器方法不可传递这一事实有关,正如所解释的
我的问题是我无法复制它。它只发生在我无法理解的特定情况下
如您所见,我正在将标签值发送到Crashlytics,因此这些是崩溃发生时发送的值
0 | 1545921010869 | D/MyActivity lhs.getLabel(): 14:49:22 | rhs.getLabel(): 13:21:22
1 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 14:49:22
2 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 14:49:22
3 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 13:21:22
4 | 1545921010870 | D/MyActivity lhs.getLabel(): 14:53:26 | rhs.getLabel(): 13:25:41
5 | 1545921010870 | D/MyActivity lhs.getLabel(): 14:53:26 | rhs.getLabel(): 14:49:22
6 | 1545921010870 | D/MyActivity lhs.getLabel(): | rhs.getLabel(): 14:49:22
7 | 1545921010870 | D/MyActivity lhs.getLabel(): | rhs.getLabel(): 13:25:41
我用这些值(加上一些带有空字符串的项)构建了一个列表,但在我的设备/模拟器中没有复制它
我的问题是:
- 无法使用相同的值进行复制的原因可能是什么
- 如果没有
条件,代码是否应该更好if
compare(a,c)
和compare to(b,c)
都是0
,因为c.getLabel()
是null
,但是compare(a,b)
显然不是空的,因此打破了易变性规则
要解决此问题,您可以任意决定带有null
标签的ListItem
s将始终位于最后(或首先,为了参数起见。只需将下面代码中的1
s替换为-1
s,反之亦然):
当任一对象为
null
时,比较函数返回0
。您可能希望确定null
对象是在排序集的开头还是结尾,并保持一致。您进行的比较将无法对标签集合'a',b',null
进行排序,因为'a'
,'a'==null
和'b'==null
,这使得它同时'a'<'b'
和'a'='b'
(因为,'a'==null='b'
),这没有任何意义。在第二种情况下,使用nullLast
你仍然会得到NullPointerException
@SchiduLuca-oops,这对我来说太草率了。编辑和固定。
0 | 1545921010869 | D/MyActivity lhs.getLabel(): 14:49:22 | rhs.getLabel(): 13:21:22
1 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 14:49:22
2 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 14:49:22
3 | 1545921010870 | D/MyActivity lhs.getLabel(): 13:25:41 | rhs.getLabel(): 13:21:22
4 | 1545921010870 | D/MyActivity lhs.getLabel(): 14:53:26 | rhs.getLabel(): 13:25:41
5 | 1545921010870 | D/MyActivity lhs.getLabel(): 14:53:26 | rhs.getLabel(): 14:49:22
6 | 1545921010870 | D/MyActivity lhs.getLabel(): | rhs.getLabel(): 14:49:22
7 | 1545921010870 | D/MyActivity lhs.getLabel(): | rhs.getLabel(): 13:25:41
Collections.sort(myList, new Comparator<ListItem>() {
@Override
public int compare(ListItem lhs, ListItem rhs) {
if (lhs.getLabel() == null) {
if (rhs.getLabel() == null) {
return 0;
}
return 1;
}
if (rhs.getLabel() == null) {
return -1;
}
return lhs.getLabel().compareTo(rhs.getLabel());
}
});
myList.sort(Comparator.comparing
(ListItem::getLabel, Comparator.nullsLast(Comparator.naturalOrder())));