如何使用 Comparable ,Comparator 接口
来源:互联网 发布:广东省五金出口数据 编辑:程序博客网 时间:2024/06/05 20:23
在用 java 编程时,经常会有这样的需求:把 list 中的某一类的对象,按照某个对象属性对所有对象在内存中进行排序,那么我们改如何实现呢? 答案是,实现 java 提供的 Comparable 接口。
我们模拟一个需求:按员工的工资从小到大排序员工对象。
我们首先定义个 Employee 类,有个3个实例属性: 员工 id(empId),名称(eName),薪资(sal), 此类实现了 Comparable 接口。
public class Employee implements Comparable { int empId; String eName; double sal; static int i; public Employee() { empId = i++; eName = "don't know"; sal = 0.0; } public Employee(String eName, double sal) { this.empId = i++; this.eName = eName; this.sal = sal; } @Override public String toString() { return "empId " + empId + "\n" + "eName " + eName + "\n" + "sal " + sal; } @Override public int compareTo(Object o) { if (this.sal == ((Employee) o).sal) return 0; else if (this.sal > ((Employee) o).sal) return 1; else return -1; }}
我在定义个 ComparableDemo 类
public class ComparableDemo { public static void main(String[] args) { List list = new ArrayList(); list.add(new Employee("Tom",40000.00)); list.add(new Employee("Harry",20000.00)); list.add(new Employee("Maggle",50000.00)); list.add(new Employee("Chris",70000.00)); Collections.sort(list); Iterator iterator = list.iterator(); while(iterator.hasNext()){ Object element = iterator.next(); System.out.println(element.toString()+"\n"); } }}
执行 ComparableDemo main 方法输出如下:
empId 1
eName Harry
sal 20000.0
empId 0
eName Tom
sal 40000.0
empId 2
eName Maggle
sal 50000.0
empId 3
eName Chris
sal 70000.0
实现注意点:
- 类 Employee 实现了 Comparable 接口,代表此类的对象是可排序的
- 类 Employee 实现了 Comparable 接口里的 compareTo 方法,此方法里实现的排序的逻辑
- 类 ComparableDemo 调用 Collections.sort(list); 对 list 的 Employee 的对象按照排序逻辑进行排序
既然有了 Comparable 接口,为什么还需要 Comparator 接口呢?
在这,我提出一个假设:如果我们的 Employee 类按照不同的实例属性排序呢?上面的例子是按照薪资从小到大排序,如果需求变化了,Employee 除了支持按 薪资(sal) 排序,还要支持按照名称(eName) 排序。现在就需要 Comparator 接口来实现了。
我们新建 NameComparator 类,实现 java.util.Comparator 接口,如下:
public class NameComparator implements Comparator { @Override public int compare(Object o1, Object o2) { Employee e1 = (Employee)o1; Employee e2 = (Employee)o2; return e1.eName.compareTo(e2.eName); }}
我们修改 ComparableDemo 类的代码如下:
public class ComparableDemo { public static void main(String[] args) { List list = new ArrayList(); list.add(new Employee("Tom", 40000.00)); list.add(new Employee("Harry", 20000.00)); list.add(new Employee("Maggle", 50000.00)); list.add(new Employee("Chris", 70000.00)); //Collections.sort(list); Collections.sort(list, new NameComparator()); Iterator iterator = list.iterator(); while (iterator.hasNext()) { Object element = iterator.next(); System.out.println(element.toString() + "\n"); } }}
运行 ComparableDemo ,结果如下:empId 3
eName Chris
sal 70000.0
empId 1
eName Harry
sal 20000.0
empId 2
eName Maggle
sal 50000.0
empId 0
eName Tom
sal 40000.0
eName Chris
sal 70000.0
empId 1
eName Harry
sal 20000.0
empId 2
eName Maggle
sal 50000.0
empId 0
eName Tom
sal 40000.0
- 如何使用 Comparable ,Comparator 接口
- Comparable接口和Comparator接口的使用
- comparator接口与Comparable接口的使用
- Comparable接口和Comparator类的使用
- java 接口Comparable和Comparator的使用
- Java Comparable Comparator 接口的使用感悟
- 使用Comparable和Comparator接口比较对象
- Comparator,Comparable接口区别
- Comparable,Comparator 接口
- comparable接口与comparator
- Comparator和Comparable接口
- Comparable 和 Comparator接口
- Comparable和Comparator接口
- Comparable接口与Comparator
- Comparable与Comparator接口
- Comparator和Comparable接口
- Comparable和Comparator接口
- Comparable和Comparator接口
- Effective C++ 学记之15 在资源管理类中提供对原始资源的访问
- 指针与数组--指针与数组的定义与声明
- 算法篇 五
- 调试利器 :PHP debug_backtrace
- 使用CRgn::CombineRgn判断两个区域是否有共同的覆盖区域
- 如何使用 Comparable ,Comparator 接口
- C++模板实例化 模板显示实例化有什么好处?
- 一周总结
- 内核链表---深入分析
- printf()格式化输出详解
- iOS设计模式(02):单例模式(转自cocoachina)
- 配置CGAL4.2+boost1_50+cmake2.8+Qt4.8.4+win7,以及运行配置CGAL自带Polyhedron demo
- Ubuntu下搭建基于Eclipse的Hadoop平台
- Autodesk AutoCAD 二次开发视频讲座一键下载 (大量视频课程)