コンパレータを使用して、複数のフィールドの値に基づいてオブジェクトの比較

ウラジミール・ゴンチャロフ:

どのように私はいくつかのフィールドでのオブジェクトのコンパレータを向上させることができますか?姓が存在しない場合、比較器は、姓または名でユーザーを並べ替える必要があります。そして、何の姓と名による最初の名前の並べ替えがない場合。しかし、これらのユーザーは、リストの最後になければなりません。

public static Comparator<UserConfigurationDto> BY_LASTNAME =  (u1, u2) -> {
        // if users have only username compare them
        if((u1.getLastName().isEmpty() && u1.getFirstName().isEmpty())
                && (u2.getLastName().isEmpty() && u2.getFirstName().isEmpty())){
            return u1.getUsername().compareToIgnoreCase(u2.getUsername());
        }
        //if user doesnt have firstName and LastName drop them at the end
        if(u1.getLastName().isEmpty() && u1.getFirstName().isEmpty()){
            return 1000000 + getWeight(u1.getUsername());
        }
        if(u2.getLastName().isEmpty() && u2.getFirstName().isEmpty()){
            return -1000000 + getWeight(u2.getUsername());
        }
      String s1 = u1.getLastName().isEmpty() ? u1.getFirstName() : u1.getLastName();
      String s2 = u2.getLastName().isEmpty() ? u2.getFirstName() : u2.getLastName();
      return s1.compareToIgnoreCase(s2);
    };
}
private static int getWeight(String s){
    return s.codePoints().sum();
}

誰がどのようにこれを改善するためのアイデアを持っていますか?私はComparator.comparingとComparator.thenComparingを使用しようとするが、彼らは誤った結果を生み出します

davidxxx:

1)return 1000000 + getWeight(u1.getUsername());と、return -1000000 + getWeight(u2.getUsername());必要ありません。return 1かつreturn -1明確であり、あなたはを参照している場合、同じ結果を生成しCompareTo()たjavadoc:

順番に指定したオブジェクトとこのオブジェクトを比較します。戻り負の整数、ゼロ、または正のこの目的は、以下のように整数で指定されたオブジェクトと等しい、またはそれ以上

2)あなたは、フィールドの比較をチェーンしませんが、比較対象物の状態に応じて、ソートの3つの方法があります。だからコードはそれぞれのケースを定義するためにビットを冗長にするということは、最終的には正常です。
あなたはたくさんの複製としてあなたはすべて同じでは抽出方法でそれを減らすことができるuser.getLastName().isEmpty()の呼び出しを。

例えば ​​:

public static Comparator<UserConfigurationDto> BY_LASTNAME =  (u1, u2) -> {

        // first case
        if( u1.isLastAndFirstNameEmpty() && u2.isLastAndFirstNameEmpty()){
            return u1.getUsername().compareToIgnoreCase(u2.getUsername());
        }
        // second case
        if(u1.isLastAndFirstNameEmpty()){
            return 1;
        }
        else if(u2.isLastAndFirstNameEmpty()){
            return -1;
        }
        // third case
        String s1 = u1.getLastName().isEmpty() ? u1.getFirstName() : u1.getLastName();
        String s2 = u2.getLastName().isEmpty() ? u2.getFirstName() : u2.getLastName();
        return s1.compareToIgnoreCase(s2);
    };

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=332673&siteId=1