当排除一个特定值时list.sort()如何工作?

时间:2017-05-22 07:02:24

标签: java list sorting collections comparator

我有一个清单

List<String> names = new ArrayList<String>();
names.add("One");
names.add("Two");
names.add("Three");
names.add("Six");
names.add("Four");
names.add("Five");

我希望这个列表排序为Six,然后它应该按字母顺序排列。

names.sort((x, y) -> {
            if (x.startsWith("S"))
                return -1;
            if (y.startsWith("S"))
                return 1; 
            return x.compareTo(y);
        });

这很好用。为什么它不适用于x.startswith("S")条件。为什么我需要为y.startsWith("S")

添加条件

2 个答案:

答案 0 :(得分:5)

您不知道sort算法将按哪种顺序比较您的String。它可能会调用compare("Two","Six"),它可能会调用compare("Six","Two")。因此,Comparator必须支持这两种情况。

此外,如果不检查startsWith("S")第一个和第二个参数,则表示您违反了Comparator合同,该合同要求sgn(compare(x, y)) == -sgn(compare(y, x))

顺便说一句,最好检查equals("Six")而不是startsWith("S")。否则,如果您的输入包含&#34; Seven&#34;。

,您的代码将会失败

答案 1 :(得分:2)

collections.sort使用合并排序,合并排序的想法是通过阶段将列表划分为单个元素列表,并在有序的事项中将它们合并回这些阶段,因此不保证您的&#34;六&#34;将是比较中的第一个元素或第二个元素