@Override
public int compareTo(Object t)
{
if(t instanceof Student)
{
Student s = (Student)t;
return (this.name.compareTo(s.name));
}
else
return -1;
}
这是我的compareTo
方法实现,用于根据名称比较两个Student
对象。是否可以根据多个字段比较两个这样的对象,即名称和年龄?
答案 0 :(得分:15)
是的,但首先您应该键入您正在实施的Comparable接口。这是它应该是什么样子:
public class Student implements Comparable<Student> {
private int age;
private String name;
@Override
public int compareTo(Student s) {
if (name.equals(s.name))
return age - s.age;
return name.compareTo(s.name));
}
}
请注意,对于类型化接口Comparable<Student>
而不是原始类型Comparable
,不需要强制转换。
答案 1 :(得分:3)
是的,可以使用Comparator
interface compare
方法根据不同的排序顺序比较两个对象。
您需要创建一个排序序列类。 Sorting user defined objects using comparator
答案 2 :(得分:1)
Apache CompareToBuilder课程值得一提。
您可以使用或不使用反射实现
public int compareTo(Object o) {
return CompareToBuilder.reflectionCompare(this, o);
}
答案 3 :(得分:0)
请注意,您在上述代码中使用overloading compareTo
方法,而不是覆盖它。
您正在实施的interface
:
public interface Comparable<T> {
public int compareTo(T o);
}
您的实施:
@Override
public int compareTo(Object t) {
//...
}
此界面的原作者Josh Bloch在他的书Effective Java中建议仅仅因为这个原因使用@Override
注释;超载引起的错误很难发现。
你说你想要“基于多个字段”来比较这些对象 - 我不确定这是否意味着“基于两个字段对它们进行单向排序”或“以多种方式对它们进行排序,每种方式都基于单个字段” 。这两种情况都是可能的,如此处的其他答案所示。
然而,这是底线:
如果您要自己创建一个类,并且想要为此类定义“自然顺序”,则应该实现Comparable<T>
。如果您想定义多个排序或者您不控制有问题的类,请在实现Comparator<T>
的类中定义您自己的排序(参见here)。