参考来自:

http://blog.csdn.net/lifuxiangcaohui/article/details/41543347

http://www.cnblogs.com/liuyuanyuanGOGO/p/java_collections.html

1.comparable的使用示例

可以看到,实现Comparable接口后,必须要重写compareTo方法。这样就使得我们自定义的类StudentDTO具备比较功能。当把StudentDTO放入集合中时,就可以对集合内的参数进行排序。

 public class StudentDTO implements Comparable{
private String name;
private int age; //setter和getter略 @Override
public int compareTo(Object o){
StudentDTO sdto = (StudentDTO)o;
int otherAge = sdto.getAge();
//注意这里的compareTo取决于参数类型,比如这里是int的比较
return this.age.compareTo(otherAge);
}
}
 public static void main(String[] args){
List<StudentDTO> studentList = new ArrayList(); StudentDTO s1 = new StudentDTO ();
s.setName("yuanyuan");
s.setAge(22);
studentList.add(s1); StudentDTO s1 = new StudentDTO ();
s.setName("lily");
s.setAge(23);
studentList.add(s2); Collections.sort(studentList); //按照age升序 22,23,
Collections.reverse(studentList); //按照age降序 23,22
}

2.comparator的使用示例

 class MyCompartor implements Comparator{
@Override
public int compare(Object o1, Object o2){
StudentDTO sdto1= (StudentDTO)o1;
StudentDTO sdto2= (StudentDTO)o2;
return sdto1.getAge.compareTo(stdo2.getAge());
}
}
 public static void main(String[] args){
List<StudentDTO> studentList = new ArrayList();
StudentDTO s1 = new StudentDTO ();
s1.setName("yuanyuan");
s1.setAge(22);
studentList.add(s1); StudentDTO s2 = new StudentDTO ();
s.2setName("lily");
s2.setAge(23);
studentList.add(s2); MyComparetor mc = new MyComparetor();
Collections.sort(studentList,mc); //按照age升序 22,23,
Collections.reverse(studentList,mc); //按照age降序 23,22
}

还有一种更常用的写法:

 //前面略
Collections.sort(studentList, new Comparator<StudentDTO>(){
/*
* int compare(Student o1, Student o2) 返回一个基本类型的整型,
* 返回负数表示:o1 小于o2,
* 返回0 表示:o1和o2相等,
* 返回正数表示:o1大于o2。
*/
public int compare(StudentDTO o1, StudentDTO o2) {
//按照学生的年龄进行升序排列 return o1.getAge().compareTo(o2.getAge());
}
});

3.CompareTo方法

由前面可知,当自定义类StudentDTO实现comparable接口后,重写了方法compareTo()具备了比较功能。

而java中的基本类都具备比较功能。比如String类:

 public final class String implements java.io.Serializable, Comparable<String>, CharSequence
 public int compareTo(String anotherString) {
int len1 = value.length;
int len2 = anotherString.value.length;
int lim = Math.min(len1, len2);
char v1[] = value;
char v2[] = anotherString.value; int k = 0;
while (k < lim) {
char c1 = v1[k];
char c2 = v2[k];
if (c1 != c2) {
return c1 - c2;
}
k++;
}
return len1 - len2;
}

所以当使用Collection.sort(list<String>())时,可以直接用。而对于自定义的类,就需要用上述两种方法中的一种来完成排序。

其次,Collections.sort()、Arrays.sort()是类似的方法。不过针对不同的类型。

并且方法里的参数可以有locale,因此就可以对中文排序等。

2017.5.16 comparator和comparable的比较及使用的更多相关文章

  1. Java集合中Comparator和Comparable接口的使用

    在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...

  2. 【原】Comparator和Comparable的联系与区别

    1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...

  3. java之Comparator与Comparable

    转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...

  4. java的Comparator和Comparable

    java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序.      ...

  5. 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!

    2017.9.16~17日,深圳市共创力企业管理咨询有限公司为某上市企业提供了为期两天的内训服务.该次内训的主题为<敏捷MINI体验式实践培训>,为期两天.此次培训由共创力资深讲师Geor ...

  6. 集合排序 Comparator和Comparable的使用区别

    Java 排序 Compare  Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...

  7. Comparator与Comparable用法与区别

    一.概述.   Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...

  8. 关于Comparator和Comparable的理解

    我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小.那这个两个又有什么区别呢? comparator 1.接口类在java.util包里面,实现接口时需要导入 ...

  9. Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):

    import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...

随机推荐

  1. Codeforces 932.B Recursive Queries

    B. Recursive Queries time limit per test 2 seconds memory limit per test 256 megabytes input standar ...

  2. ci动态设置config配置

    $this->config->set_item('cookie', 'item_value');echo $this->config->item('cookie');

  3. log4net配置,正在用

    <?xml version="1.0" encoding="utf-8" ?> <log4net> <appender name= ...

  4. pdf.js如何跨域读取pdf文件?

    今天,上线一个客户网站之后(使用的是广州新一代虚拟空间)发现在读取上传的pdf文件的时候读取错误,通过直接在浏览器输入文件地址的时候发现文件地址被重定向了(呵呵!),结果就是pdf文件源由本地直接变成 ...

  5. [bzoj4514][SDOI2016]数字配对——二分图

    题目描述 传送门 题解: 这个题真的是巨坑,经过了6个WA,2个TLE,1个RE后才终于搞出来,中间都有点放弃希望了... 主要是一定要注意longlong! 下面开始说明题解. 朴素的想法是: 如果 ...

  6. C# WeakReference(弱引用)

    WeakReference(弱引用)我们平常用的都是对象的强引用,如果有强引用存在,GC是不会回收对象的.我们能不能同时保持对对象的引用,而又可以让GC需要的时候回收这个对象呢?.NET中提供了Wea ...

  7. 解决:eclipse 断点调试进入到class文件,无法查看变量值问题

    今天团队一小伙伴调试项目时,一不小心选错了源文件目录(maven分模块项目),选到了顶层父项目下的文件,结果调试时发现无法查看调试过程中的变量值,要解决这个问题,其实很简单,稍稍配置一下就可以了,为了 ...

  8. mysql 故障整理

    mysql> system mysqldump -uroot -p -B mingongge >/root/mingongge_bak.sql Enter password: mysqld ...

  9. 新疆大学ACM-ICPC程序设计竞赛五月月赛(同步赛)C 勤奋的杨老师【DP/正反LIS/类似合唱队形】

    链接:https://www.nowcoder.com/acm/contest/116/C 来源:牛客网 题目描述 杨老师认为他的学习能力曲线是一个拱形.勤奋的他根据时间的先后顺序罗列了一个学习清单, ...

  10. Python与数据结构[1] -> 栈/Stack[0] -> 链表栈与数组栈的 Python 实现

    栈 / Stack 目录 链表栈 数组栈 栈是一种基本的线性数据结构(先入后出FILO),在 C 语言中有链表和数组两种实现方式,下面用 Python 对这两种栈进行实现. 1 链表栈 链表栈是以单链 ...