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使用合併排序,合併排序的想法是通過階段將列表劃分爲單個元素列表,並在有序事物的這些階段將它們合併回來,因此不保證您的「六個」將成爲第一個元素或第二個元素的比較

相關問題