需要帮助为我的求职面试代码示例编写比较器

时间:2009-10-13 01:20:21

标签: java comparator

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

我想要这个输出: -

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

}

5 个答案:

答案 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)

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