2017-05-22 43 views
1

我有一个列表list.sort()如何在排除一个特定值时工作?

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

我想这个列表进行排序,使得六是第一位的,然后应该是按字母顺序排列。

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")

回答

5

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

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

顺便说一句,最好是检查equals("Six")而不是startsWith("S")。否则如果你的输入包含“Seven”,你的代码将失败。

2

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

相关问题