Comparator 与 Comparable
2015-12-09 17:09
465 查看
说道Comparator 与 Comparable接口,就不得不说一下Collections和Arrays这两个类,他们分别为集合和数组提供一些查找、排序的操作。那么就以Collections为例,它有一个sort(),方法可以试下集合元素的排序。比如一个集合 ArrayList<Integer> arr,我们可以通过Collections.sort(arr),对其进行排序,那么问题来了,Integer类型是数字自然可以进行排序,可是如果集合中的元素是一些我们自定义的对象怎么办呢???比如我们定义了一个Person类,ArrayList<Person>
arr2,那么显然Collections.sort(arr2)是会报错的,这时候怎么办呢,这就需要我们定义自己的比较器,Collection是中提供了另一个重载方法sort(Collection c,Comparater com)。
下面看例子:
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
Person1 p13 = new Person1("x3",11);
Person1 p14 = new Person1("x4",10);
ArrayList<Person1> l1 = new ArrayList<Person1>();
l1.add(p11);
l1.add(p12);
l1.add(p13);
l1.add(p14);
Collections.sort(l1,new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
}
}
class Person1{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
上面的例子中我们编写了自己的比较规则,那就是按年龄排序
这时候,有人说,这样有点儿麻烦,我还是想用第一个sort()方法进行排序可以吗???
当然可以,这个时候就用到了Comparable接口,我们可以让Person实现Comparable接口,然后在Person内部定义自己的比较规则。
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person2 p21 = new Person1("x1",12);
Person2 p22 = new Person1("x2",16);
Person2 p23 = new Person1("x3",13);
Person2 p24 = new Person1("x4",15);
ArrayList<Person2> l1 = new ArrayList<Person2>();
l1.add(p21);
l1.add(p22);
l1.add(p23);
l1.add(p24);
Collections.sort(l1);
});
}
}
class Person2 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}
这样实现了同样的功能。
总结:Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,通俗讲Comparable是给类赋予可比较性,而Comparator
是在外部定义了一个比较器,与类本身并无关联。
如果不是调用sort方法,相要直接比较两个对象的大小,如下:
Comparator定义了俩个方法,分别是 int compare(T o1, T o2)和 boolean equals(Object obj),
用于比较两个Comparator是否相等
有时在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p21 = new Person1("x1",12);
Person1 p22 = new Person1("x2",16);
Comparator c = new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
int k = c.compare(p21,p22);
}
}
class Person2{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
Comparable接口只提供了 int compareTo(T o)方法,也就是说假如我定义了一个Person类,这个类实现了 Comparable接口,那么当我实例化Person类的person1后,我想比较person1和一个现有的Person对象person2的大小时,我就可以这样来调用:person1.comparTo(person2),通过返回值就可以判断了;
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
p11.compareTo(p12)
}
}
class Person1 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}
arr2,那么显然Collections.sort(arr2)是会报错的,这时候怎么办呢,这就需要我们定义自己的比较器,Collection是中提供了另一个重载方法sort(Collection c,Comparater com)。
下面看例子:
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
Person1 p13 = new Person1("x3",11);
Person1 p14 = new Person1("x4",10);
ArrayList<Person1> l1 = new ArrayList<Person1>();
l1.add(p11);
l1.add(p12);
l1.add(p13);
l1.add(p14);
Collections.sort(l1,new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
}
}
class Person1{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
上面的例子中我们编写了自己的比较规则,那就是按年龄排序
这时候,有人说,这样有点儿麻烦,我还是想用第一个sort()方法进行排序可以吗???
当然可以,这个时候就用到了Comparable接口,我们可以让Person实现Comparable接口,然后在Person内部定义自己的比较规则。
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person2 p21 = new Person1("x1",12);
Person2 p22 = new Person1("x2",16);
Person2 p23 = new Person1("x3",13);
Person2 p24 = new Person1("x4",15);
ArrayList<Person2> l1 = new ArrayList<Person2>();
l1.add(p21);
l1.add(p22);
l1.add(p23);
l1.add(p24);
Collections.sort(l1);
});
}
}
class Person2 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}
这样实现了同样的功能。
总结:Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,通俗讲Comparable是给类赋予可比较性,而Comparator
是在外部定义了一个比较器,与类本身并无关联。
如果不是调用sort方法,相要直接比较两个对象的大小,如下:
Comparator定义了俩个方法,分别是 int compare(T o1, T o2)和 boolean equals(Object obj),
用于比较两个Comparator是否相等
有时在实现Comparator接口时,并没有实现equals方法,可程序并没有报错,原因是实现该接口的类也是Object类的子类,而Object类已经实现了equals方法
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p21 = new Person1("x1",12);
Person1 p22 = new Person1("x2",16);
Comparator c = new Comparator<Person2>() {
@Override
public int compare(Person2 o1, Person2 o2) {
// TODO Auto-generated method stub
return o1.age - o2.age;
}
});
int k = c.compare(p21,p22);
}
}
class Person2{
public String name;
public int age;
public Person2(String name,int age){
this.name = name;
this.age = age;
}
}
Comparable接口只提供了 int compareTo(T o)方法,也就是说假如我定义了一个Person类,这个类实现了 Comparable接口,那么当我实例化Person类的person1后,我想比较person1和一个现有的Person对象person2的大小时,我就可以这样来调用:person1.comparTo(person2),通过返回值就可以判断了;
看例子
package test;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class CompateTest {
public static void main(String[]args){
Person1 p11 = new Person1("x1",12);
Person1 p12 = new Person1("x2",13);
p11.compareTo(p12)
}
}
class Person1 implements Comparable<Person1>{
public String name;
public int age;
public Person1(String name,int age){
this.name = name;
this.age = age;
}
@Override
public int compareTo(Person1 o) {
// TODO Auto-generated method stub
return this.age - o.age;
}
}
}
相关文章推荐
- hadoop推荐
- Mybatis批量删除
- 管理SELINUX
- xcode6.4 7.2下载地址
- Java Serializable(序列化)的理解和总结、具体实现过程
- 游标
- linux安装usb wifi接收器
- Linux脚本EOF
- hadoop相关整理
- iOS框架——I&J&L字头
- leetcode -- Integer to English Words -- 无聊题目,很麻烦,再做一遍
- Java--流重点总结初稿
- Android 答题系统源码,答题demo(第六周)
- iOS CocoaPods 快速导入
- 【转】Javascript DI!Angular依赖注入的实现原理
- 如何将一个用utf-8编码的文本用java程序转换成ANSI编码的文本
- 获取当前url并指定url中的字符 效果
- 夺命雷公狗---Smarty NO:22 常量—变量
- docker 制作tomcat 镜像并应用
- 提升UITableView性能-复杂页面的优化