A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© wenyu 中级黑马   /  2015-3-4 16:46  /  1090 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

如何对集合里的元素进行自定义比较?
另外,Comparator 和Comparable有什么区别?

2 个回复

倒序浏览
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 21:09 编辑

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