【问题标题】:Can I use a Comparator without implementing Comparable?我可以在不实现 Comparable 的情况下使用 Comparator 吗?
【发布时间】:2010-12-24 06:09:41
【问题描述】:

是否可以在不实现 Comparable 类的情况下使用 Comparator?例如,如果我有以下情况:

MyClass {

     Comparator comp;

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

}

然后我可以使用 comp 比较两个对象吗?如果是这样,我将如何去做?

谢谢...

【问题讨论】:

    标签: java comparator


    【解决方案1】:

    是的。

    Comparator 和 Comparable 是两个独立的实体,只是它们的用途相似。

    在您的代码中简单地执行:comp.compare(obj1, obj2)

    【讨论】:

      【解决方案2】:

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

      创建一个排序顺序(在这种情况下)颠倒的树形图。

      【讨论】:

      • 听起来很傻,但是如果我不知道我在比较什么类型的对象怎么办?因此,如果我将比较方法更改为接受(对象 a,对象 b),有什么办法可以继续比较对象吗?或者查看对象的类型,然后进行比较?
      • @behrk - 如果您不知道对象的类型,“小于”是什么意思?您仅限于(可能)无意义的排序,例如“哈希码顺序”和“toString() 值的顺序”。
      【解决方案3】:

      你不使用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
      }
      

      【讨论】:

        猜你喜欢
        • 2018-10-15
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2015-04-13
        • 2020-04-22
        相关资源
        最近更新 更多