Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/sorting/2.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 了解对集合排序时的比较方法_Java_Sorting_Comparison_Comparator - Fatal编程技术网

Java 了解对集合排序时的比较方法

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

我有以下代码对具有label属性的项目集合进行排序:

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
    条件,代码是否应该更好

正如您所指出的,这个比较器是不可传递的。考虑三代码< ListITEM <代码> >代码> A<代码>代码> B>代码>代码> >代码>标签>代码>“<代码/代码>,代码>”B“< /代码>和<代码> null < /代码>。使用这个比较器,
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())));