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

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

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

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

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

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

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

 import java.util.HashSet;
import java.util.Set; /**
* 学生类
* @author lenovo
*
*/
public class Student implements Comparable<Student> { public String id; public String name; public Set<KeCheng> kecheng; @Override
public int hashCode() {
final int prime = 31;
int result = 1;
result = prime * result + ((name == null) ? 0 : name.hashCode());
return result;
} @Override
public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (!(obj instanceof Student))
return false;
Student other = (Student) obj;
if (name == null) {
if (other.name != null)
return false;
} else if (!name.equals(other.name))
return false;
return true;
} public Student(String id,String name){
this.id = id;
this.name = name;
this.kecheng = new HashSet<KeCheng>();
} @Override
public int compareTo(Student arg0) {
// TODO 自动生成的方法存根
return this.id.compareTo(arg0.id);
} }

Comparable的用法如下

 /*
* 对其他类型泛型的List进行排序
*/
public void testSort3(){
List<Student> stuList = new ArrayList<Student>();
Student stu1 = new Student("3","Tom");
Student stu2 = new Student("1","Jack");
Student stu3 = new Student("2","Lily");
stuList.add(stu1);
stuList.add(stu2);
stuList.add(stu3);
System.out.println("\n-------排序前------------\n");
for (Student st : stuList) {
System.out.print("元素:"+st.id+" "+st.name);
}
Collections.sort(stuList);
System.out.println("\n-------排序后------------\n");
for (Student st : stuList) {
System.out.print("元素:"+st.id+" "+st.name);
} }

打印输出的结果为

-------排序前------------

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

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

 import java.util.Comparator;

 public class StudentComparator implements Comparator<Student>{

     @Override
public int compare(Student o1, Student o2) {
// TODO 自动生成的方法存根
return o1.name.compareTo(o2.name);
} }

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

 /*
* 对其他类型泛型的List进行排序
*/
public void testSort3(){
List<Student> stuList = new ArrayList<Student>();
Student stu1 = new Student("3","Tom");
Student stu2 = new Student("1","Jack");
Student stu3 = new Student("2","Lily");
stuList.add(stu1);
stuList.add(stu2);
stuList.add(stu3);
Collections.sort(stuList,new StudentComparator());
System.out.println("\n-------按姓名排序后------------\n");
for (Student st : stuList) {
System.out.print("元素:"+st.id+" "+st.name);
}
}

打印输出的结果为

-------按姓名排序后------------

元素:1  Jack元素:2  Lily元素:3  Tom

Java集合中Comparator和Comparable接口的使用的更多相关文章

  1. Java集合中List,Set以及Map等集合体系详解

    转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...

  2. Java集合中List、Set以及Map

    概述: List , Set, Map都是接口:List , Set继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有 ...

  3. 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法

    注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...

  4. Java集合中Set的常见问题及用法

    在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...

  5. Map容器——TreeMap及常用API,Comparator和Comparable接口

    TreeMap及常用API ①   TreeMap类通过使用红黑树实现Map接口; ②   TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③   不像散列(HashMap), ...

  6. Java基础之comparator和comparable的区别以及使用

    Java基础之comparator和comparable的区别以及使用 1: 区别:  .Comparable类需要实现此接口,定义在类内,不利于扩展 2 .Comparator更灵活,可以随时自定义 ...

  7. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  8. Java集合中迭代器的常用用法

    该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...

  9. Java集合中的LinkedHashMap类

    jdk1.8.0_144 本文阅读最好先了解HashMap底层,可前往<Java集合中的HashMap类>. LinkedHashMap由于它的插入有序特性,也是一种比较常用的Map集合. ...

随机推荐

  1. mysql几种性能测试的工具使用

    mysql几种性能测试的工具使用 近期由于要比较mysql及其分支mariadb, percona的性能,了解了几个这方面的工具,包括:mysqlslap sysbench tpcc-mysql,做一 ...

  2. 存储过程中的when others then 和 raise

    EXCEPTION when others then rollback; dbms_output.put_line('code:' || sqlcode); dbms_output.put_line( ...

  3. Linux基本使用(1)-使用GCC编译C语言程序

  4. CF459A Pashmak and Garden (水

    Pashmak and Garden Codeforces Round #261 (Div. 2) A. Pashmak and Garden time limit per test 1 second ...

  5. [译]View components and Inject in ASP.NET MVC 6

    原文:http://www.asp.net/vnext/overview/aspnet-vnext/vc 介绍view components view components (VCs) 类似于part ...

  6. 此请求的查询字符串的长度超过配置的 maxQueryStringLength 值 --不仅wen.fonfig一个地方需要设置

    提示已经很明确了... 搜出来的都是: <system.webServer> <security> <requestFiltering> <requestLi ...

  7. VTK初学一,e_Triangle三角形的绘制

    #ifndef INITIAL_OPENGL #define INITIAL_OPENGL #include <vtkAutoInit.h> VTK_MODULE_INIT(vtkRend ...

  8. git 初始化

    Git global setup git config --global user.name "杨清1" git config --global user.email " ...

  9. ie下获取上传文件全路径

    ie下获取上传文件全路径,3.5之后的火狐是没法获取上传文件全路径的 /*获取上传文件路径*/ function getFilePath(obj) { var form = $(this).paren ...

  10. 微信 6.5.1 for iOS发布 可以在朋友圈分享相册中的视频

    今天微信 6.5.1 for iOS发布了,最主要的一个功能是可以在朋友圈分享相册中的视频,卖转发朋友圈视频软件的家伙估计要哭了.微信这次更新,更有利于个人号的运营,个人号的价值将更高.先定一个小目标 ...