关于Comparable与Comparator
首先说明一下这两个都是用来排序的, 只是应用起来有点差别而已.
有以下情景:
对于 List<String> list = new ArrayList<String>(); 我们可以直接用 Collections.sort(list); 排序. 那么我们如果有自己一个类比如: Person类, 要想在List中排序的话, 怎么做?
1. 使用 Comparable 接口在 Person 类内部实现排序
2. 使用 Comparator 接口自定义一个排序类, 在使用 Collections.sort() 方法的时候传进去, 实现排序.
首先来说第一种方法:
定义一个Person 类, 实现 Comparable 接口, 并实现其 compareTo(T o) 方法
public class Person implements Comparable<Person> {
private String name;
private Integer age;
public Person() {
super();
}
public Person(String name, Integer age) {
super();
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person o) {
if (this.age > o.age) {
return 1;
} else if (this.age < o.age) {
return -1;
}
return 0;
}
@Override
public String toString() {
return "Person [name=" + name + ", age=" + age + "]";
}
}
关于返回值需要知道:
a). 返回 正数 表示当前对象比传入的对象大.
b). 返回 负数 表示当前对象比传入的对象小.
c). 返回 0 表示等值.
测试类:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import org.junit.Test;
public class TestComparable {
@Test
public void test() {
List<Person> list = new ArrayList<>();
Person p1 = new Person("Tom", 12);
Person p2 = new Person("Mike", 14);
Person p3 = new Person("Jerry", 6);
list.add(p1);
list.add(p2);
list.add(p3);
// 对 list 集合进行排序, 这时Person类中的 compareTo起排序作用.
Collections.sort(list);
System.out.println(list);
}
}
这种方法灵活度差, 只适用于当前类, 通用性差, 但是简单, 只要实现这个接口, 定义了比较的规则, 直接调用 Collections.sort(list); 就可以了.
接下来说第二种方法:
首先要自己写一个排序类, 并实现 Comparator 接口.
import java.util.Comparator;
public class MyComparator implements Comparator<String> {
@Override
public int compare(String o1, String o2) {
if( o1.charAt(1) > o2.charAt(1) ){
return 1;
} else if(o1.charAt(1) < o2.charAt(1)){
return -1;
}
return 0;
}
}
当然我这里是给 String 类排序, 只是例子, 因为String 类已经内部利用第一种方法实现了排序, 可以查看 String 的源代码.
返回值的规则与第一种方法是一样的.
测试类:
import java.util.Arrays;
import java.util.List;
import org.junit.Test;
public class TestComparator {
@Test
public void test(){
List<String> list = Arrays.asList("Tom","Mike","Jerry","Kim");
list.sort(new MyComparator());
System.out.println(list);
}
}
用这个方法的好处是, 不需要修改源代码, 只需要定义比较器就可以了, 然后在排序的时候把比较器传进去就 OK 了.
也可以写一些通用的比较方法在里面, 提高通用性.
各有好处, 灵活使用就好了.
关于Comparable与Comparator的更多相关文章
- Java中Comparable与Comparator的区别
相同 Comparable和Comparator都是用来实现对象的比较.排序 要想对象比较.排序,都需要实现Comparable或Comparator接口 Comparable和Comparator都 ...
- 对象比较器:Comparable和Comparator
在进行对象数组排序的过程中需要使用到比较器,比较器有两个:Comparable和Comparator ①.java.lang.Comparable:是在类定义是时候默认实现好的接口,里面提供有一个co ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- Comparable和Comparator的区别
Comparable Comparable可以认为是一个内比较器,实现了Comparable接口的类有一个特点,就是这些类是可以和自己比较的,至于具体和另一个实现了Comparable接口的类如何比较 ...
- Java中Comparable和Comparator区别小结
一.Comparable简介 Comparable是排序接口.若一个类实现了Comparable接口,就意味着该类支持排序.实现了Comparable接口的类的对象的列表或数组可以通过Collecti ...
- Java 中 Comparable 和 Comparator 比较
Java 中 Comparable 和 Comparator 比较 目录: Comparable Comparator Comparable 和 Comparator比较 第二个例子 之 Compar ...
- Comparable与Comparator
转载 Comparable与Comparator的区别 (转载) Comparable & Comparator 都是用来实现集合中元素的比较.排序的,只是 Comparable 是在集合内部 ...
- Java中的TreeMap、Comparable、Comparator
我们知道HashMap的存储位置是按照key这个对象的hashCode来存放的,而TreeMap则是不是按照hashCode来存放,他是按照实现的Comparable接口的compareTo这个方法来 ...
- 比较器comparable与comparator的使用
在Java学习和使用里,工具类与算法类(collections和Arrays)也是我们使用比较多的,在它们里面就包含了comparable与comparator这两种比较器. 一.比较器的分类与概念 ...
- 简谈Comparable和Comparator区别
对于Comparable和Comparator这连个相似的接口,还是做一下比较比较好: Comparable Comparator (1)只包含一个compareTo()方法,此方法可以给两个对象排序 ...
随机推荐
- Vim常用命令总结
Vim常用命令总结: 下文是小编自己整理的关于日常linux vim编程过程中用的一些常用命令,资料参考鸟哥的 如果有需要的小伙伴可以参考一下!(底部有下载地址) 一. 一般模式可用的按钮说明 1.1 ...
- 现代DOJO(翻译)
http://dojotoolkit.org/documentation/tutorials/1.10/modern_dojo/index.html 你可能已经不用doio一段时间了,或者你一直想保持 ...
- opengl入门学习
OpenGL入门学习 说起编程作图,大概还有很多人想起TC的#include <graphics.h>吧? 但是各位是否想过,那些画面绚丽的PC游戏是如何编写出来的?就靠TC那可怜的640 ...
- Index was outside the bounds of the array. (Microsoft.SqlServer.Smo)
本地ssms是 安装Sqlserver 2008 r2 自带的 远端的server是sqlserver2014 可以连接,可以执行查询语句.但是,不能使用ssms生成对象的脚本.推测ssms 2008 ...
- SVN版本问题:svn: E155021: This client is too old to work with the working copy at
最近Android Studio SVN老是提示: SVN版本问题:svn: E155021: This client is too old to work with the working copy ...
- 【HOW】如何限制Reporting Services报表导出功能中格式选项
Reporting Services报表导出功能中缺省会提供多种导出格式选项,但很多情况下不需要全部的格式选项,因此需要对这些选项进行限制.下面我们以SQL Server 2008 R2为例来说明对这 ...
- 【HOW】如何通过URL给Reporting Services报表传递参数
[本地模式Reporting Services] 参见官方文档:http://msdn.microsoft.com/en-us/library/ms154042.aspx 示例:http://serv ...
- 【简洁之美】裴波那切数列生成器 python
裴波那切数列可以用生成器较好的去生成,直接上代码: # 1 控制最大数字版本 def fib(max): x,y = 0,1 while y < max: yield x x,y = y,x+y ...
- Linq并行执行
一. 并行LINQ 1. 并行查询 .NET4在System.Linq名称空间中包含一个新类ParalleIEnumerable ,可以分解查询的工作使其分布在多个线程上.尽管Enmerab ...
- 思考方式--SMART原则
如果你对项目管理.系统架构有兴趣,请加微信订阅号"softjg",加入这个PM.架构师的大家庭 万事开头于你目标的设定,如果开始走错了,那么后面的路将会更加的错误,甚至于更加的努力 ...