zoukankan      html  css  js  c++  java
  • Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口。

    Comparable接口 -- 默认比较规则,可比较的

    • 实现该接口表示:这个类的实例可以比较大小,可以进行自然排序
    • 定义了默认的比较规则
    • 其实现类需要实现comparaTo()方法
    • comparaTo()方法返回整数表示大,负数表示小,0表示相等

    Comparator接口 -- 临时比较规则,比较工具接口

    • 用于定义临时比较规则,而不是默认比较规则
    • 其实现类需要实现compara()方法
    • Comparator和Comparable都是Java集合框架的成员

     我们以学生信息为例演示这两个接口的使用方法

    首先定义一个学生类,实现Comparable接口

     1 import java.util.HashSet;
     2 import java.util.Set;
     3 
     4 /**
     5  * 学生类
     6  * @author lenovo
     7  *
     8  */
     9 public class Student implements Comparable<Student> {
    10 
    11     public String id;
    12     
    13     public String name;
    14     
    15     public Set<KeCheng> kecheng;
    16     
    17     @Override
    18     public int hashCode() {
    19         final int prime = 31;
    20         int result = 1;
    21         result = prime * result + ((name == null) ? 0 : name.hashCode());
    22         return result;
    23     }
    24 
    25     @Override
    26     public boolean equals(Object obj) {
    27         if (this == obj)
    28             return true;
    29         if (obj == null)
    30             return false;
    31         if (!(obj instanceof Student))
    32             return false;
    33         Student other = (Student) obj;
    34         if (name == null) {
    35             if (other.name != null)
    36                 return false;
    37         } else if (!name.equals(other.name))
    38             return false;
    39         return true;
    40     }
    41 
    42     public Student(String id,String name){
    43         this.id = id;
    44         this.name = name;
    45         this.kecheng = new HashSet<KeCheng>();
    46     }
    47 
    48     @Override
    49     public int compareTo(Student arg0) {
    50         // TODO 自动生成的方法存根
    51         return this.id.compareTo(arg0.id);
    52     }
    53     
    54 }

    Comparable的用法如下

     1 /*
     2      * 对其他类型泛型的List进行排序
     3      */
     4     public void testSort3(){
     5         List<Student> stuList = new ArrayList<Student>();
     6         Student stu1 = new Student("3","Tom");
     7         Student stu2 = new Student("1","Jack");
     8         Student stu3 = new Student("2","Lily");
     9         stuList.add(stu1);
    10         stuList.add(stu2);
    11         stuList.add(stu3);
    12         System.out.println("
    -------排序前------------
    ");
    13         for (Student st : stuList) {
    14             System.out.print("元素:"+st.id+"  "+st.name);
    15         }
    16         Collections.sort(stuList);
    17         System.out.println("
    -------排序后------------
    ");
    18         for (Student st : stuList) {
    19             System.out.print("元素:"+st.id+"  "+st.name);
    20         }
    21         
    22     }

    打印输出的结果为

    -------排序前------------
    
    元素:3  Tom元素:1  Jack元素:2  Lily
    -------排序后------------
    
    元素:1  Jack元素:2  Lily元素:3  Tom

    Comparator是对List的元素按照Id的自然顺序默认排序,如果想要按照姓名排序,我们需要用到Comparator接口,并且实现其compara方法

     1 import java.util.Comparator;
     2 
     3 public class StudentComparator implements Comparator<Student>{
     4 
     5     @Override
     6     public int compare(Student o1, Student o2) {
     7         // TODO 自动生成的方法存根
     8         return o1.name.compareTo(o2.name);
     9     }
    10 
    11 }

    然后在我们的测试方法中添加如下代码

     1 /*
     2      * 对其他类型泛型的List进行排序
     3      */
     4     public void testSort3(){
     5         List<Student> stuList = new ArrayList<Student>();
     6         Student stu1 = new Student("3","Tom");
     7         Student stu2 = new Student("1","Jack");
     8         Student stu3 = new Student("2","Lily");
     9         stuList.add(stu1);
    10         stuList.add(stu2);
    11         stuList.add(stu3);
    12         Collections.sort(stuList,new StudentComparator());
    13         System.out.println("
    -------按姓名排序后------------
    ");
    14         for (Student st : stuList) {
    15             System.out.print("元素:"+st.id+"  "+st.name);
    16         }
    17     }

    打印输出的结果为

    -------按姓名排序后------------
    
    元素:1  Jack元素:2  Lily元素:3  Tom
  • 相关阅读:
    Django~学习计划
    在路上---学习篇(一)Python 数据结构和算法 (1)
    面向对象设计原则—单一、开闭、里氏替换原则
    flex布局实现elment容器布局
    js 面向对象的三大特性
    Http状态码大全(200、404、500等)
    HTTP常见状态码 200 301 302 404 500
    Android编程中,sp和px和dp有什么区别
    Android xml资源文件中@、@android:type、@*、?、@+含义和区别
    Android虚拟键盘上下左右键按下和弹起的响应事件
  • 原文地址:https://www.cnblogs.com/jpwz/p/5684059.html
Copyright © 2011-2022 走看看