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集合. ...
随机推荐
- YII2数据库依赖缓存
首先配置一下缓存,自己选择是用文件缓存还是数据库缓存等. 'cache' => [ 'class' => 'yii\caching\FileCache', ], 然后就可以通过 Yii:: ...
- Struts2验证框架实例
今天写了个Struts验证框架的实例,总算把验证框架弄清楚了. 上一篇Struts实例的action没有继承ActionSupport类,虽然也可以实现action的功能,但是却不能应用Struts提 ...
- ajax实例详解
页面通过ajax和后台进行数据交互是非常简洁且方便的.特别是封装成json数据格式. 此处使用的是jQuery的ajax var params = { version:new Date().getTi ...
- javascript的对象 和 JSON 对象?
关于js和JSON的 一篇 好文章: http://www.68idc.cn/help/makewebs/javascript/20150704416007.html 讲的很好 很易懂 在将javas ...
- vmstat、top
vmstat是一个查看虚拟内存(Virtual Memory)使用状况的工具,使用vmstat命令可以得到关于进程.内存.内存分页.堵塞IO.traps及CPU活动的信息. vmstat 最常用的有两 ...
- [译]JavaScript:将字符串两边的双引号转换成单引号
原文:http://ariya.ofilabs.com/2012/02/from-double-quotes-to-single-quotes.html 代码的不一致性总是让人发狂,如果每位开发者都能 ...
- 使用pygal 做chart图的经验分享
看到小芮介绍了pygal文章后, http://rfyiamcool.blog.51cto.com/1030776/1378400, 我一直搞数据工作, 所以对于这种数据的展现很有兴趣. 做了点研究, ...
- 【CISP笔记】安全漏洞与恶意代码(2)
恶意代码自我保护 进程保护 进程守护 超级权限 检测对抗 反动态调试 反静态调试 恶意代码检测技术 特征码扫描 沙箱技术 行为检测 恶意代码分析技术 静态分析 需要实际执行恶意代码,它通过对其二进制文 ...
- nyoj 14 会场安排问题(贪心专题)
会场安排问题 时间限制:3000 ms | 内存限制:65535 KB 难度:4 描述 学校的小礼堂每天都会有许多活动,有时间这些活动的计划时间会发生冲突,需要选择出一些活动进行举办.小刘的工 ...
- 文字的多列布局--column