2017.5.16 comparator和comparable的比较及使用
参考来自:
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的比较及使用的更多相关文章
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- 【原】Comparator和Comparable的联系与区别
1.知识点了解 Comparator和Comparable都是用用来实现集合中元素的比较.排序的,所以,经常在集合外定义Comparator接口的方法和集合内实现Comparable接口的方法中实现排 ...
- java之Comparator与Comparable
转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...
- java的Comparator和Comparable
java的Comparator和Comparable 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. ...
- 2017.9.16~17,热烈庆祝共创力罗老师《敏捷MINI体验式实战培训》在某大型企业成功举办!
2017.9.16~17日,深圳市共创力企业管理咨询有限公司为某上市企业提供了为期两天的内训服务.该次内训的主题为<敏捷MINI体验式实践培训>,为期两天.此次培训由共创力资深讲师Geor ...
- 集合排序 Comparator和Comparable的使用区别
Java 排序 Compare Comparator接口 Comparable接口 区别 在Java中使用集合来存储数据时非常常见的,集合排序功能也是常用功能之一.下面看一下如何进行集合排序,常用的 ...
- Comparator与Comparable用法与区别
一.概述. Comparator和Comparable两者都属于集合框架的一部分,都是用来在对象之间进行比较的,但两者又有些许的不同,我们先通过一个例子来看一下他们的区别,然后再分别学习下它们的源 ...
- 关于Comparator和Comparable的理解
我们都知道,实现Comparator和Comparable这两个接口,可以实现对对象比较大小.那这个两个又有什么区别呢? comparator 1.接口类在java.util包里面,实现接口时需要导入 ...
- Java://Comparator、Comparable的用法(按照要求将set集合的数据进行排序输出):
import java.util.ArrayList; import java.util.Collections; import java.util.Comparator; //comparator. ...
随机推荐
- echarts移动端字体模糊解决方法
echarts使用canvas画图,在移动端使用rem时候,若viewport的scale被缩放,则字体会发生模糊,本人采用的解决方法是在不同的dpr下使用不同的字体大小,具体代码如下: 获取字体大小 ...
- [经验分享]NuGet发布自己的Dll(类库包)
什么是Nuget Nuget是一个.NET平台下的开源的项目,它是Visual Studio的扩展.在使用Visual Studio开发基于.NET Framework的应用时,Nuget能把在项目中 ...
- java中TCP两个例子大写服务器和文件上传
大写服务器的实例: package com.core.net; import java.io.BufferedReader; import java.io.BufferedWriter; import ...
- webpack最佳入门实践系列(3)
6.使用图片 6.1.尝试在css中引入图片 在src目录下新建css文件夹,并且在css文件夹下创建app.css文件,在src目录下新建images文件夹,放入一张图片,在app.css中引入这张 ...
- HDU1541 经典树状数组
HDU1541 题意: 如图,等级为0的点有1,等级为1得点有4,2 等级为2的点有3,等级为3的点有5-------即即左下角的点的个数 现给你一些点(x,y),输入顺序按y升序,y相等时按x升序 ...
- 洛谷P3120 [USACO15FEB]Cow Hopscotch
题目描述 Just like humans enjoy playing the game of Hopscotch, Farmer John's cows have invented ...
- dedeCMS常用功能板块记忆
1.自动调到栏目第一个子栏目 <script> {dede:channel type='son' row='1'} window.location.href='[field:typelin ...
- 1.tornado基础
import tornado.web ''' tornado基础web框架模块 ''' import tornado.ioloop ''' tornado的核心循环IO模块,封装了linux的epol ...
- 文件夹操作-DirectoryInfo类
DirectoryInfo类是一个密封类,它可以用来创建.移动.枚举目录和子目录.DirectoryInfo类包括4个属性,可以用来获取目录的名称.父目录等. DirectoryInfo类的属性表 属 ...
- mysql 主从手动切换
将主从(3307主--3308从)切换 前提:3307正常 一.将3307设为只读.命令行操作 # 修改配置文件 vim /etc/mysql/mysql-//my.cnf # 在[mysqld]中增 ...