Java集合中Comparator和Comparable接口的使用
在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接口的使用的更多相关文章
- Java集合中List,Set以及Map等集合体系详解
转载请注明出处:Java集合中List,Set以及Map等集合体系详解(史上最全) 概述: List , Set, Map都是接口,前两个继承至collection接口,Map为独立接口 Set下有H ...
- Java集合中List、Set以及Map
概述: List , Set, Map都是接口:List , Set继承至Collection接口,Map为独立接口 Set下有HashSet,LinkedHashSet,TreeSet List下有 ...
- 【java集合框架源码剖析系列】java源码剖析之java集合中的折半插入排序算法
注:关于排序算法,博主写过[数据结构排序算法系列]数据结构八大排序算法,基本上把所有的排序算法都详细的讲解过,而之所以单独将java集合中的排序算法拿出来讲解,是因为在阿里巴巴内推面试的时候面试官问过 ...
- Java集合中Set的常见问题及用法
在这里演示的案例是衔接Java集合中的List(点击查看)那篇博文的,本节我们学习的Set的用法. Set是Collection的一个重要的子接口,Set中的元素是无序排列的,并且元素不可以重复,被称 ...
- Map容器——TreeMap及常用API,Comparator和Comparable接口
TreeMap及常用API ① TreeMap类通过使用红黑树实现Map接口; ② TreeMap提供按排序顺序存储键/值对的有效手段,同时允许快速检索; ③ 不像散列(HashMap), ...
- Java基础之comparator和comparable的区别以及使用
Java基础之comparator和comparable的区别以及使用 1: 区别: .Comparable类需要实现此接口,定义在类内,不利于扩展 2 .Comparator更灵活,可以随时自定义 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java集合中迭代器的常用用法
该例子展示了一个Java集合中迭代器的常用用法public class LinkedListTest { public static void main(String[] args) { List&l ...
- Java集合中的LinkedHashMap类
jdk1.8.0_144 本文阅读最好先了解HashMap底层,可前往<Java集合中的HashMap类>. LinkedHashMap由于它的插入有序特性,也是一种比较常用的Map集合. ...
随机推荐
- bootstrap-select去除蓝色边框outline
/*去除选择框的outline*/ .bootstrap-select .dropdown-toggle:focus{outline:none !important;} /*去除选项的outline* ...
- ps切图设置
1. 新建设置 文件->新建->预设->自定义 1920 像素 2000 像素 72 像素/英寸 背景内容 透明 存储预设 2.视图设置 视图->显示->智能参考线选中视 ...
- Orchard源码分析(4.1):Orchard.Environment.CollectionOrderModule类
CollectionOrderModule类是一个Autofac模块(Module,将一系列组件和相关的功能包装在一起),而非Orchard模块.其作用是保证多个注册到容器的组件能按FIFO(Firs ...
- 卸载金山猎豹免费WIfi后,上不了网的解决办法
进入网络和共享中心,打开网络适配器,右键无线连接,属性,就在打开属性的那个页面,在靠上的位置有个LieBao xxx Driver,卸载. 然后,打开浏览器,试试这个链接:www.baidu.com. ...
- 用友android
获取token要改 value要改 不用通配符 直接双引号
- tc 146 2 BridgeCrossing(n人过桥问题)
SRM 146 2 1000BridgeCrossing Problem Statement A well-known riddle goes like this: Four people are c ...
- 【PHP面向对象(OOP)编程入门教程】2.什么是类,什么是对象,类和对象这间的关系
类的概念:类是具有相同属性和服务的一组对象的集合.它为属于该类的所有对象提供了统一的抽象描述,其内部包括属性和服务两个主要部分.在面向对象的编程语言中,类是一个独立的程序单位,它应该有一个类名并包括属 ...
- nginx反向代理、动静分离
环境:根据http://www.cnblogs.com/zzzhfo/p/6032095.html配置 方法一:根据目录实现动静分离 在web01创建image并上传一张图片作为静态页面 [root@ ...
- Android开发学习笔记--计时器的应用实例
为了了解安卓计时器的用法,写了一个秒表的应用,正是这个秒表,让我对Android应用的速度大跌眼镜,我设置了一个计时器,10ms更新一次显示的时间,然后更标准的时间一比较发现,跑10s就有一秒的时间误 ...
- HDU 4930 Fighting the Landlords(模拟)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=4930 解题报告:斗地主,加了一个四张可以带两张不一样的牌,也可以带一对,判断打出一手牌之后,如果对手没 ...