3 回答

TA貢獻1878條經驗 獲得超4個贊
1)return 1000000 + getWeight(u1.getUsername());
并且 return -1000000 + getWeight(u2.getUsername());
不是必需的。如果您參考javadoc return 1
,則更清晰并產生相同的結果:return -1
CompareTo()
比較此對象與指定對象的順序。返回 負整數、零或正整數,因為此對象小于、等于或大于指定對象
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);
};

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

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() );
}
};
添加回答
舉報