gpt4 book ai didi

java - 使用 Comparator 根据多个字段的值比较对象

转载 作者:行者123 更新时间:2023-11-29 04:08:53 24 4
gpt4 key购买 nike

如何通过多个字段改进对象的比较器?如果姓氏不存在,比较器必须按姓氏或名字对用户进行排序。如果没有姓氏和名字,则按用户名排序。但是这些用户必须在列表的末尾。

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 但它们产生了不正确的结果

最佳答案

1) return 1000000 + getWeight(u1.getUsername());return -1000000 + getWeight(u2.getUsername()); 不是必需的。 return 1return -1 更清晰,如果您引用 CompareTo() javadoc 会产生相同的结果:

Compares this object with the specified object for order. Returns a negative integer, zero, or a positive integer as this object is less than, equal to, or greater than the specified object

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

关于java - 使用 Comparator 根据多个字段的值比较对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56398822/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com