2009-12-08 138 views
0

是否可以在不实现Comparable类的情况下使用Comparator?例如,如果我有以下内容:我可以使用比较器而不实现可比较吗?

MyClass { 

    Comparator comp; 

    OrderedListInheritance(Comparator c) { 
      this.comp = c; 
    } 

} 

我可以用comp来比较两个对象吗?如果是这样,我该怎么做呢?

谢谢...

回答

4

不要使用Comparable。您使用Comparator

Comparable是由对象实现指定与相同类型的其他对象它们的排序顺序的接口。

Comparator是一个通用的接口,只是需要两个对象,并告诉你它们的排序顺序。所以,你可以这样做:

public class Student { 
    private final int id; 
    private final String name; 
    private final int age; 

    public Student(int id, String name, int age) { 
    this.id = id; 
    this.name = name; 
    this.age = age; 
    } 

    public int getId() { return id; } 
    public String getName() { return name; } 
    public int getAge() { return age; } 
} 

有:

public class AgeComparator implements Comparator<Student> { 
    public int compare(Student s1, Student s2) { 
    if (s1.getAge() == s2.getAge()) { 
     return 0; 
    } else { 
     return s1.getAge() < s2.getAge() ? -1 : 1; 
    } 
} 

和:

List<Student> students = new ArrayList<Student>(); 
students.add(new Student(1, "bob", 15)); 
students.add(new Student(2, "Jane", 14)); 
students.add(new Student(3, "Gary", 16)); 

SortedSet<Student> set1 = new TreeSet<Student>(new AgeComparator()); 
set1.addAll(students); 
for (Student student : set1) { 
    // age order 
} 
4

Comparator<T>public int compare(T lhs, T rhs)。所以使用该方法来比较对象。

此外,排序的集合将接受Comparator作为参数,所以你可以(例如)说:

Comparator<Integer> comparator = new Comparator<Integer>() { 
    @Override public int compare(Integer lhs, Integer rhs) { 
    if (rhs.intValue() < lhs.intValue()) 
     return -1; 
    else if (rhs.intValue() > lhs.intValue()) 
     return 1; 
    else 
     return 0; 
    } 
}; 
new TreeMap<Integer, Integer>(comparator); 

要创建树地图,排序顺序是(INT这种情况下)逆转。

+0

这有很大帮助,谢谢! – littleK 2009-12-08 02:07:21

+0

这听起来很愚蠢,但如果我不知道我比较的是什么类型的对象呢?所以如果我改变了比较方法来接受(对象a,对象b),那么我有什么办法可以继续比较对象吗?或者检查以查看对象的类型,然后比较? – littleK 2009-12-08 02:19:08

+2

@behrk - 如果你不知道对象的类型,“不到”的含义是什么?你被限制为(可能)无意义的排序,如“哈希码顺序”和“toString()值的顺序”。 – 2009-12-08 03:46:05

0

是。

比较器和比较的是两个单独的和独立的实体,只是他们的目的是相似的。

在你的代码简单地做:comp.compare(obj1, obj2)