我需要帮助来写一个比较器: -
我想要这个输出: -
Martin Joseph Male 4/2/1979 Green
Ramya Patil Female 5/4/2009 Red
Don kelly Male 5/6/1986 Yellow
Van Shinde female 3/4/1984 Green
但我得到以下输出: -
Output 1:
Van Shinde female 3/4/1984 Green
Don kelly Male 5/6/1986 Yellow
Ramya Patil Female 5/4/2009 Red
Martin Joseph Male 4/2/1979 Green
我如何排序姓氏保持列表的顺序完整..我的意思是我想输出女性首先排序的姓氏,然后男性排序的姓氏...请帮助我们..
这是我在使用性别比较器后使用的比较器: -
public class LastNameComparator implements Comparator<Person> {
public int compare(Person name_one, Person name_two) {
// TODO Auto-generated method stub
if(name_one.getGender().equals(name_two.getGender())){
return name_one.getLast_name().compareTo(name_two.getLast_name());
}else{
return name_one.getLast_name().compareTo(name_two.getLast_name());
}
}
}
答案 0 :(得分:4)
public int compare(Person a, Person b) {
int ret = a.getGender().compareTo(b.getGender());
if (ret == 0) {
ret = a.getLastName().compareTo(b.getLastName());
}
return ret;
}
答案 1 :(得分:1)
当我阅读你的OP中的代码时,我发现你总是返回按姓氏比较的结果:
If genders are equal
then compare last names
else compare last names
然而,你说你得到的实验结果并不多;因此,为了修改你的代码以匹配Cletus的建议,你的代码也可能出现其他问题。
答案 2 :(得分:1)
Cletus的解决方案在这里可能是最合适的,但是如果你想进一步采取它......
LastNameComparator
被误导性地命名,因为它实际上比较了性别和姓氏。将此功能拆分为两个单独的Comparators
:
class GenderComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getGender().compareTo(b.getGender());
}
}
class LastNameComparator implements Comparator<Person> {
public int compare(Person a, Person b) {
return a.getLastName().compareTo(b.getLastName());
}
}
然后,将功能合并到“自定义”Comparator
:
Comparator<Person> genderThenLastNameComparator = new Comparator<Person>() {
public int compare(Person a, Person b) {
int result = new GenderComparator().compare(a, b);
return result == 0 ? new LastNameComparator().compare(a, b) : result;
}
}
它更复杂,但更灵活,可重复使用。 (对于这样一个简单的案例,这可能是也可能不合理。)
答案 3 :(得分:0)
作为cletus答案的补充,这是一个使用CompareToBuilder
的版本(来自Apache Commons Lang):
public int compare(Person lhs, Person rhs) {
return new CompareToBuilder()
.append(lhs.getGender(), rhs.getGender())
.append(lhs.getLastName(), rhs.getLastName())
.toComparison();
}
答案 4 :(得分:0)
这应该相对简单:
以下是您指定的规则:
// if the genders are not equal, return <0 if this object's gender is female
// else
// return lastName.compareTo( obj.lastName );
这就是实现这个比较器所需的全部......
然后当你想对它进行排序时,使用集合框架排序!
public static <T> void sort(List<T> list,
Comparator<? super T> c)
这也是一个稳定的类型......这太棒了。如果你这样回答我,我相信你会得到这份工作。