黑马程序员技术交流社区
标题:
如何对集合里的元素进行自定义比较?
[打印本页]
作者:
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的比较类
import java.util.Comparator;
public class StudentComparator implements Comparator<Student> {
@Override
public int compare(Student s1, Student s2) {
// TODO Auto-generated method stub
if(s1.getAge()>s2.getAge())
return 1;
else if(s1.getAge()<s2.getAge())
return -1;
else return 0;
}
}
复制代码
然后调用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