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集合. ...
随机推荐
- ASP.NET MVC使用Bootstrap系列(4)——使用JavaScript插件
阅读目录 序言 Data属性 VS 编程API 下拉菜单(dropdown.js) 模态框(modal.js) 标签页(tab.js) 工具提示(tooltip.js) 弹出框(popover.js) ...
- char,short ,int ,long,long long,unsigned long long数据范围
from:http://www.cnblogs.com/A123456A/archive/2013/01/25/2876634.html char,short ,int ,long,long long ...
- eclipse将引用了第三方jar包的java项目打成jar包
今天用java开发了一个项目,想要打成jar包,并在linux环境下运行.但是运行时引用的第三方jar包却显示classNotFind错误. 于是查了一下解决办法,在此贴出来,方便以后查阅. 用Ecl ...
- motto2
Baby you've done enough that cut your breath.Don't beat yourself up don't need to turn so fast.Somet ...
- 单例模式singleton
在进行开发的时候,我们在有些情形下有些对象我们只需要一个.例如:配置文件.工具类.线程池.缓存.日志对象等. 如何保证我们的对象只有一个呢?我们可以通过单例来实现. 常用的单例有两种:饿汉模式和懒汉模 ...
- [PHP知识点乱炖]四、全局变量——小偷从良记
本章要讲的是PHP的全局变量. 这里讲个小故事: 很多年前,一个很聪明的小偷,想去偷一户人家的钱.可是他偷不到主人的钥匙,怎么办呢? 他想到了一个办法,去之前嚼了一块口香糖,口香糖的牌子是“大大泡泡糖 ...
- github及其他记录
http://mvnrepository.com/artifact/org.jdom/jdom/1.1.3 https://github.com/open-power-workgroup/Hospit ...
- Windows Phone 8下 友盟社会化组件SDK的使用。
由于项目的需要,要将友盟的社会化组件SDK由0.9更新至2.0. 版本变化比较大. 1.很多类以及命名空间已经取消了. 如UmengSocialSDK.Net.Request命名空间, UmengSo ...
- JS跳转后台
location.href = ROOT+"?"+VAR_MODULE+"=FaPiao&"+VAR_ACTION+"=dell&id ...
- hash-3.hashCode
1.有一个类Person,有两个字段age和name,我重写Object类的equal方法来比较两个对象的age和name是否相等,但是不重写hashCode. package com.hash; p ...