2017.5.16 comparator和comparable的比较及使用
2024-08-29 15:06:26
参考来自:
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,因此就可以对中文排序等。
最新文章
- 慕课网-安卓工程师初养成-2-5 如何命名Java变量
- Android 去掉title bar的3个方法
- [MFC]MFC中OnDraw与OnPaint的区别
- ubuntu grub配置
- Java String StringBuffer StringBuilder
- 《Linear Algebra and Its Applications》-chaper3-行列式-克拉默法则
- Boost Thread学习笔记三
- WPF案例 (四) 模拟Windows7桌面任务栏
- QTP使用技巧
- Vim插件之插件管理器Vundle
- js操作cookie 使用详解
- 自学Python5.4-内置模块(2)
- Linux 下的JDK环境的搭建
- 本地项目上传到CODING
- ABA问题
- 从零开始学 Web 之 ES6(一)ES5严格模式
- codeforces547a
- 【转】Java学习---JDK、JRE和JVM的关系
- HTML5基础小结(二)——标签小例
- GIT修改邮箱
热门文章
- 【CZY选讲&#183;一道图论好题】
- linux正则表达式(一)
- Restful 权限的思考
- jquery,zepto插件编写相关
- clips 前端 js 倒计时 获取验证码的按钮
- MyEclipse内安装与使用SVN
- 杭电oj2012-2021
- (七)insmod/rmmod
- mysql 共享空间转为独立表空间
- 关于 Delphi 中流的使用(1) 用 TMemoryStream(内存流) 入门 &;&;&; 关于指针的迷惑,我自己问的.