在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. bootstrap-select去除蓝色边框outline

    /*去除选择框的outline*/ .bootstrap-select .dropdown-toggle:focus{outline:none !important;} /*去除选项的outline* ...

  2. ps切图设置

    1. 新建设置 文件->新建->预设->自定义 1920 像素 2000 像素 72 像素/英寸 背景内容 透明 存储预设 2.视图设置 视图->显示->智能参考线选中视 ...

  3. Orchard源码分析(4.1):Orchard.Environment.CollectionOrderModule类

    CollectionOrderModule类是一个Autofac模块(Module,将一系列组件和相关的功能包装在一起),而非Orchard模块.其作用是保证多个注册到容器的组件能按FIFO(Firs ...

  4. 卸载金山猎豹免费WIfi后,上不了网的解决办法

    进入网络和共享中心,打开网络适配器,右键无线连接,属性,就在打开属性的那个页面,在靠上的位置有个LieBao xxx Driver,卸载. 然后,打开浏览器,试试这个链接:www.baidu.com. ...

  5. 用友android

    获取token要改 value要改 不用通配符 直接双引号

  6. tc 146 2 BridgeCrossing(n人过桥问题)

    SRM 146 2 1000BridgeCrossing Problem Statement A well-known riddle goes like this: Four people are c ...

  7. 【PHP面向对象(OOP)编程入门教程】2.什么是类,什么是对象,类和对象这间的关系

    类的概念:类是具有相同属性和服务的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...

  8. nginx反向代理、动静分离

    环境:根据http://www.cnblogs.com/zzzhfo/p/6032095.html配置 方法一:根据目录实现动静分离 在web01创建image并上传一张图片作为静态页面 [root@ ...

  9. Android开发学习笔记--计时器的应用实例

    为了了解安卓计时器的用法,写了一个秒表的应用,正是这个秒表,让我对Android应用的速度大跌眼镜,我设置了一个计时器,10ms更新一次显示的时间,然后更标准的时间一比较发现,跑10s就有一秒的时间误 ...

  10. HDU 4930 Fighting the Landlords(模拟)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没 ...