Java比较方法初学者

时间:2013-11-18 00:51:26

标签: java compareto

虽然Comparable应该捕捉一个类的自然顺序,但也可以想象不自然的顺序。所以:在下面提供的方框中,重新实现compareTo()方法,以便一个婴儿小于另一个,如果他或她的名字的长度小于另一个。

public class Infant implements Comparable {

    private  String name;
    private int age;  // in months

    public Infant(String who, int months) {
        name = who;
        age = months;
    }

    public String getName() {
        return name;
    }

    public int getAge() {
        return age;
    }

    public void anotherMonth() {
        age = age + 1;
    }

这就是我所拥有的,但我不明白

    public int compareTo(Object other) {
        String b = ((Infant)other).getName();
        String a = this.name;
        return a.compareTo(b);
    }

2 个答案:

答案 0 :(得分:2)

compareTo允许您定义两个对象相互比较的结果......

因此,对于您的示例,您可以使用...

public int compareTo(Object other) {
    String b = ((Infant)other).getName();
    String a = this.name;
    return(a.length() - b.length());
}

一般来说,我个人会创建“目的”构建Comparable,允许您根据需要更改默认行为。

因此,您可以定义一个ByNameLengthComparable和/或ByAgeComparable,例如Arrays#sortCollections#sort可能会过去......

答案 1 :(得分:0)

听起来你想要两个排序 - 自然排序和另类排序。这是ComparableComparator的用途。

现在完全取决于你,但是我只想说我希望Infant的自然顺序是年龄,而备用顺序是名称的长度。

然后你可以利用泛型来做到这一点:

public class Infant implements Comparable<Infant> {
//Stuff

  public int compareTo(Infant other) {
    return new Integer(age).compareTo(other.age);
    //or you can of course do the primitive comparisons but I'm lazy
    //and don't hate autoboxing
  }    
}

然后你可以这样做:

public class InfantNameLengthComparator implements Comparator<Infant> {
  int compare(Infant first, Infant second) {
    return new Integer(first.getName().length()).compareTo(second.getName().length());
  }
}

然后你可以用两种方式排序:

Collections.sort(listOfInfants);按年龄 - 默认,自然顺序

按名称长度

Collections.sort(listOfInfants, new InfantNameLengthComparator());

您甚至可以添加其他Comparator来按名称按字母顺序执行其他排序,同时始终按年龄保留自然顺序。

因此,您可以同时使用ComparableComparator来提供自然顺序和备用顺序。

如果您愿意,可以查看我们最近对此确切主题所做的tutorial

希望这有帮助。