java内外部比较器(Comparator、Comparable)使用场景与详解
2017-04-18 17:53
519 查看
内外部比较器使用:
内部比较器:需比较的类实现接口 Comparable,使该类对外提供一个默认比较的实现public class Test { public static void main(String[] args) { //创建TreeSet并加入worker对象 TreeSet<Worker> set = new TreeSet<Worker>(); set.add(new Worker("zhang3", 18)); set.add(new Worker("li4", 25)); set.add(new Worker("wang5", 22)); set.add(new Worker("lao6", 22)); set.add(new Worker("xiaoming", 22)); //遍历输出信息 Iterator<Worker> iterator = set.iterator(); while (iterator.hasNext()) { Worker worker = iterator.next(); System.out.println(worker); } } } public class Worker implements Comparable<Worker> { private String name; private int age; public Worker(String name, int age) { super(); this.name = name; this.age = age; } /* * 先按年龄排,次要按名字排 * 负整数、零或正整数,根据此对象是小于、等于还是大于指定对象。 */ @Override public int compareTo(Worker w) { int sub = this.age - w.age; if (sub == 0) return this.name.compareTo(w.name);//使用String的comareTo方法 else return sub; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Worker [name=" + name + ", age=" + age + "]"; } }
外部比较器:需比较的类不做任何实现,该类通过工具类Collections调用sort方法传入一个实现了接口 Comparator的类和一个List
public class Test { public static void main(String[] args) { //创建List并加入worker对象 List<Worker> list = new ArrayList<Worker>(); list.add(new Worker("zhang3", 18)); list.add(new Worker("li4", 25)); list.add(new Worker("wang5", 22)); list.add(new Worker("lao6", 22)); list.add(new Worker("xiaoming", 22)); Collections.sort(list, new MyComparator());//传入list和比较器排序 //遍历输出信息 for (int i = 0; i < list.size(); i++) { Worker worker = list.get(i); System.out.println(worker); } } } public class Worker { private String name; private int age; public Worker(String name, int age) { super(); this.name = name; this.age = age; } public String getName() { return name; } public int getAge() { return age; } @Override public String toString() { return "Worker [name=" + name + ", age=" + age + "]"; } } public class MyComparator implements Comparator<Worker> { /* * 先按年龄排,次要按名字排 * 根据第一个参数小于、等于或大于第二个参数分别返回负整数、零或正整数 */ @Override public int compare(Worker o1, Worker o2) { int sub = o1.getAge() - o2.getAge(); if (sub == 0) return o1.getName().compareTo(o2.getName());//使用String的comareTo方法 else return sub; } }
总结:
TreeSet仅能根据创建时实现的comparable接口(内部比较器)进行排序,且HashSet不支持内部比较器,工具类Collections.sort()方法仅能对List排序。TreeSet—使用— 内部比较器
List—使用—外部比较器
在一个类没有提供比较器时或提供的比较器不适用时,就需要使用外部比较器(例如:拿到一个jar包但它的类没比较器,总不能反编译去改代码)
相关文章推荐
- Java常用类库——Arrays类(用于普通数组操作)、比较器(Comparable、Comparator 用于对象排序)的使用
- java比较器Comparable和Comparator的使用
- java底层比较器Comparable和Comparator比较对象时的使用
- java comparable comparator 比较器的使用 及 自定义比较器
- 浅谈Java比较器comparable/comparator
- java常用类库续3(比较器Comparable、Comparator、观察者设计模式、正则表达式、定时调度)
- Java核心API -- 7(Iterator迭代器、Comparable、Comparator比较器)
- JAVAWEB开发之Lucene详解——Lucene入门及使用场景、全文检索、索引CRUD、优化索引库、分词器、高亮、相关度排序、各种查询
- java学习笔记13--比较器(Comparable、Comparator)
- 详解Java中Comparable和Comparator接口的区别
- Java6.0中Comparable接口与Comparator接口详解
- Java中Comparator和Comparable的使用
- java Comparable 和Comparator 详解及区别
- Java中List,Set和Map详解及其区别和使用场景(转)
- 内部比较器Comparable和外部比较器Comparator
- java比较器Comparable接口和Comparator接口
- java中Comparable接口和Comparator接口的使用
- Java 比较器Comparable和Compartor的使用
- java Comparable 和Comparator详解及 区别(附代码)
- java 接口Comparable和Comparator的使用