2017-08-27 11 views
0

私は私のカスタムコンパレータ書いている:なぜこのように比較していますか?

 public static Comparator<String> compareEThenEverything(){ 
      return (s1, s2) -> { 
       if(s1.toLowerCase().startsWith("e") && s2.toLowerCase().startsWith("e")) 
       return 0; 
       if(s1.toLowerCase().startsWith("e")) return 1; 
       return -1; 
      }; 
     } 

をそして私は「E」で始まるすべての文字列が最初になることを私の配列をソートします。

なぜ現在のコンパレータが逆転しているのですか?最初の文字に "e"を付けた単語は、他の文字と比べると大きかったと思います。

どうしてですか?

+0

は十分なはずコンパレータのJavaDocの最初の行を読む:

は、あなたが他の文字列も同様にソートしたい場合は、String. CASE_INSENSITIVE_ORDERでそれをチェーンすることができますhttps://docs.oracle.com/javase /8/docs/api/java/util/Comparator.html#compare-TT- –

+5

2番目の条件は、前のif文と同じであるため評価されません。 – vk23

+0

@NoMercy ye、あなたは正しいです – Andrew

答えて

4

1最初引数は引数より大きく、デフォルトの順序が増加しているので、[はい電子で始まるものは、最後に来るので、何が必要なの-1を交換することであることを意味します1

他の人がすでに指摘したように
public static Comparator<String> compareEThenEverything(){ 
    return (s1, s2) -> { 
     if(s1.toLowerCase().startsWith("e")) 
      return -1; 
     if(s1.toLowerCase().startsWith("e") && s2.toLowerCase().startsWith("e")) 
      return 0; 
     return 1; 
    }; 
} 
+3

はい、 'return 0'の代わりに' return s1.compareToIgnoreCase(s2) 'にする必要があります。なぜなら、名前は" Eを比較する "というものなので、ある時点ですべてを比較する必要があるということです。 =) – corsiKa

+3

この 'if(s1.toLowerCase()。startsWith(" e "))は-1を返します;' は対称原理を尊重しません。 – davidxxx

0

は、あなたがComparator contractは反対のように動作しますので、それは「逆転」を参照してください。

2つの引数を比較して注文します。 負の値、ゼロ、または正の整数を返します。最初の引数はより小さく、2番目の値以上です。

先に進む前にComparator javadocを読むことを強くお勧めします。


このコンパレータは、「e」で始まる文字列を常に先頭に表示します。

private static final Comparator<String> E_FIRST = (s1, s2) -> { 
    char s1c = s1.isEmpty() ? (char) Character.UNASSIGNED : Character.toLowerCase(s1.charAt(0)); 
    char s2c = s2.isEmpty() ? (char) Character.UNASSIGNED : Character.toLowerCase(s2.charAt(0)); 
    return s1c == 'e' ? (s1c == s2c ? 0 : -1) : s2c == 'e' ? 1 : 0; 
}; 

また、この実装では、文字列全体を小文字に変換するのではなく、最初の文字のみをチェックします。

E_FIRST.thenComparing(String.CASE_INSENSITIVE_ORDER) 
関連する問題