Java 我可以使用比较器而不实现可比性吗?

Java 我可以使用比较器而不实现可比性吗?,java,comparator,Java,Comparator,是否可以在不实现可比较类的情况下使用比较器?例如,如果我有以下几点: MyClass { Comparator comp; OrderedListInheritance(Comparator c) { this.comp = c; } } 然后我可以用comp来比较两个对象吗?如果是这样的话,我该怎么做呢 谢谢…你不用。你用 Comparable是一个由对象实现的接口,用于指定其与相同类型的其他对象的排序顺序 Comparator是一个通

是否可以在不实现可比较类的情况下使用比较器?例如,如果我有以下几点:

MyClass {

     Comparator comp;

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

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

谢谢…

你不用。你用

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类AgeComparator实现Comparator{
公共整数比较(学生s1、学生s2){
如果(s1.getAge()==s2.getAge()){
返回0;
}否则{
返回s1.getAge()
以及:

List students=new ArrayList();
添加(新学生(1,“bob”,15));
添加(新学生(2,“Jane”,14));
添加(新学生(3,“Gary”,16));
SortedSet set1=新树集(新年龄比较器());
set1.addAll(学生);
for(学生:set1){
//年龄顺序
}
比较器
具有
公共整数比较(tlhs,trhs)
。因此使用该方法比较对象

此外,排序后的集合将接受一个
比较器作为参数,因此您可以(例如)说:

比较器比较器=新比较器(){ @覆盖公共整数比较(整数lhs、整数rhs){ if(rhs.intValue()lhs.intValue()) 返回1; 其他的 返回0; } }; 新树形图(比较器);
创建排序顺序(在本例中)颠倒的树映射。

比较方和可比方是两个独立的实体,只是目的相似


在您的代码中,只需执行以下操作:
comp.compare(obj1,obj2)

听起来很傻,但是如果我不知道要比较的对象是什么类型呢?那么如果我将compare方法更改为accept(对象a,对象b),有没有办法让我继续比较对象?或者检查对象的类型,然后进行比较?@behrk-如果您不知道对象的类型,“小于”的含义是什么?您(可能)被限制为“哈希代码顺序”和“toString()值的顺序”等无意义的顺序。
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
}
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);