博客
关于我
Java集合中Comparator和Comparable接口的使用
阅读量:86 次
发布时间:2019-02-26

本文共 3604 字,大约阅读时间需要 12 分钟。

在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
{10 11 public String id;12 13 public String name;14 15 public Set
kecheng;16 17 @Override18 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 @Override26 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
();46 }47 48 @Override49 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
stuList = new ArrayList
(); 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("\n-------排序前------------\n");13 for (Student st : stuList) {14 System.out.print("元素:"+st.id+" "+st.name);15 }16 Collections.sort(stuList);17 System.out.println("\n-------排序后------------\n");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
{ 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
stuList = new ArrayList
(); 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("\n-------按姓名排序后------------\n");14 for (Student st : stuList) {15 System.out.print("元素:"+st.id+" "+st.name);16 }17 }

打印输出的结果为

-------按姓名排序后------------元素:1  Jack元素:2  Lily元素:3  Tom

 

转载地址:http://vfak.baihongyu.com/

你可能感兴趣的文章
MYSQL中TINYINT的取值范围
查看>>
MySQL中UPDATE语句的神奇技巧,让你操作数据库如虎添翼!
查看>>
Mysql中varchar类型数字排序不对踩坑记录
查看>>
MySQL中一条SQL语句到底是如何执行的呢?
查看>>
MySQL中你必须知道的10件事,1.5万字!
查看>>
MySQL中使用IN()查询到底走不走索引?
查看>>
Mysql中使用存储过程插入decimal和时间数据递增的模拟数据
查看>>
MySql中关于geometry类型的数据_空的时候如何插入处理_需用null_空字符串插入会报错_Cannot get geometry object from dat---MySql工作笔记003
查看>>
mysql中出现Incorrect DECIMAL value: '0' for column '' at row -1错误解决方案
查看>>
mysql中出现Unit mysql.service could not be found 的解决方法
查看>>
mysql中出现update-alternatives: 错误: 候选项路径 /etc/mysql/mysql.cnf 不存在 dpkg: 处理软件包 mysql-server-8.0的解决方法(全)
查看>>
Mysql中各类锁的机制图文详细解析(全)
查看>>
MySQL中地理位置数据扩展geometry的使用心得
查看>>
Mysql中存储引擎简介、修改、查询、选择
查看>>
Mysql中存储过程、存储函数、自定义函数、变量、流程控制语句、光标/游标、定义条件和处理程序的使用示例
查看>>
mysql中实现rownum,对结果进行排序
查看>>
mysql中对于数据库的基本操作
查看>>
Mysql中常用函数的使用示例
查看>>
MySql中怎样使用case-when实现判断查询结果返回
查看>>
Mysql中怎样使用update更新某列的数据减去指定值
查看>>