黑马程序员技术交流社区

标题: 如何对集合里的元素进行自定义比较? [打印本页]

作者: wenyu    时间: 2015-3-4 16:46
标题: 如何对集合里的元素进行自定义比较?
如何对集合里的元素进行自定义比较?
另外,Comparator 和Comparable有什么区别?

作者: ko889910    时间: 2015-3-4 20:34
comparator是一个比较器接口其中只有一个方法int copmare(T t1,T t2)
方法中定义的比较规则:例如student类中含有name和age两个属性,你的比较规则是
年龄的大的studnet>年龄小的student那就可以写一个实现comparator的比较类
  1. import java.util.Comparator;

  2. public class StudentComparator implements Comparator<Student> {

  3.         @Override
  4.         public int compare(Student s1, Student s2) {
  5.                 // TODO Auto-generated method stub
  6.                 if(s1.getAge()>s2.getAge())
  7.                         return 1;
  8.                 else if(s1.getAge()<s2.getAge())
  9.                         return -1;
  10.                 else return 0;
  11.         }
  12. }
复制代码

然后调用Collections.sort(list,new StudentComparator());按照你的排序规则进行排序
comparable与comparator类似不过是必须让你进行比较的类实现
class Student implements comparable{}
comparable中的方法是int nt copmare(T t1)
也是用于比较规则的书写用this和t1比较
这样使用sort方法排序的时候就会调用compare方法进行排序
不在需要输入第二个参数了
作者: z47057554    时间: 2015-3-4 20:43
本帖最后由 z47057554 于 2015-3-4 21:09 编辑

    针对比较的两种比较方式都是针对二叉树存储的,如TreeSet,TreeMap,优先使用Comparator的比较规则比较
    因为要存入容器,必须要实现Comparable,这是类本身具有的在存入二叉权容器时的比较方式,即类实现Comparabler接口气复写的方法compareTo(),也就是说Comparable比较方式是类一定有的.
    当你不想用类自身的比较方式存入容器时,比如类具有 int age,String name属性,它自身的比较方法是比较age的,而你想要比较的是name,而此时类的代码已经写好,改代码显然是不具备扩展性的,那么此时就需要向你存入数据的容器传递一个按照name比较的比较器Comparator实现的子类,容器接受比较器后,会按照会按照name比较结果排序存储,而不是按照类自身age的比较结果





欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2