0

我需要帮助来编写一个比较器:-

我想要这个输出:-

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

}
4

5 回答 5

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;
}
于 2009-10-13T01:29:54.363 回答
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());
    }
}

然后,将功能组合在 'custom' 中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;
    }
}

它更复杂,但更灵活和可重用。(对于这样一个简单的案例,这可能有道理,也可能没有道理。)

于 2009-10-13T01:48:49.537 回答
1

当我阅读您的 OP 中的代码时,我发现您总是返回按姓氏进行比较的结果:

If genders are equal
  then compare last names
  else compare last names

然而,这并没有你说你得到的实验结果。因此,除了修改您的代码以匹配 Cletus 的建议外,您的代码可能还有其他问题。

于 2009-10-13T01:34:54.277 回答
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)

这也是一个稳定的排序......这太棒了。如果你这样回答,我相信你会得到这份工作。

于 2009-10-15T17:13:52.310 回答
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();
}
于 2009-10-13T01:31:56.263 回答