亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

使用 Comparator 根據多個字段的值比較對象

使用 Comparator 根據多個字段的值比較對象

陪伴而非守候 2022-12-28 15:44:27
如何通過多個字段改進對象的比較器?如果姓氏不存在,比較器必須按姓氏或名字對用戶進行排序。如果沒有姓氏和名字,則按用戶名排序。但是這些用戶必須在列表的末尾。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 但它們產生的結果不正確
查看完整描述

3 回答

?
UYOU

TA貢獻1878條經驗 獲得超4個贊

1)return 1000000 + getWeight(u1.getUsername());并且 return -1000000 + getWeight(u2.getUsername());不是必需的。如果您參考javadoc return 1,則更清晰并產生相同的結果:return -1CompareTo()

比較此對象與指定對象的順序。返回 整數、整數,因為此對象小于、等于或大于指定對象

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

    };


查看完整回答
反對 回復 2022-12-28
?
尚方寶劍之說

TA貢獻1788條經驗 獲得超4個贊

我認為您可以使用包含鍵比較器的 Java 8 靜態比較函數來實現此目的。String 有一個方便的不區分大小寫的比較器,您也可以在一些地方使用它。

Comparator.comparing(

                (UserConfigurationDto u) -> u.getLastName().isEmpty()?u.getFirstName():u.getLastName(),

                ((s1, s2) -> {

                    if(s1.isEmpty()) {

                        return 1;

                    } else if(s2.isEmpty()) {

                        return -1;

                    }

                    else {

                        return String.CASE_INSENSITIVE_ORDER.compare(s1, s2);

                    }

                }))

                .thenComparing(UserConfigurationDto::getUsername, String.CASE_INSENSITIVE_ORDER);


查看完整回答
反對 回復 2022-12-28
?
慕工程0101907

TA貢獻1887條經驗 獲得超5個贊

你出錯的地方是試圖應用“權重”的概念。在 Java 中處理比較器時,函數中唯一重要的值是 0、大于 0 和小于 0。


這樣的事情似乎有效:


public static final Comparator<UserConfgurationDto> BY_LASTNAME = ( u1, u2 ) ->

{

    boolean u1hasName = !u1.getLastName().isEmpty() || !u1.getFirstName().isEmpty();

    boolean u2hasName = !u2.getLastName().isEmpty() || !u2.getFirstName().isEmpty();


    if ( u1hasName && !u2hasName )

    {

        // u1 < u2

        return -1;

    }

    else if ( !u1hasName && u2hasName )

    {

        // u2 < u1

        return 1;

    }

    else if ( u1hasName && u2hasName )

    {

        String s1 = u1.getLastName().isEmpty() ? u1.getFirstName() : u1.getLastName();

        String s2 = u2.getLastName().isEmpty() ? u2.getFirstName() : u2.getLastName();


        return s1.compareToIgnoreCase( s2 );

    }

    else

    {

        return u1.getUsername().compareToIgnoreCase( u2.getUsername() );

    }

};


查看完整回答
反對 回復 2022-12-28
  • 3 回答
  • 0 關注
  • 243 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號