黑马程序员技术交流社区
标题:
Comparable和Comparator的区别
[打印本页]
作者:
李晓斌
时间:
2011-12-17 00:27
标题:
Comparable和Comparator的区别
本帖最后由 李晓斌 于 2011-12-19 11:38 编辑
Comparable和Comparator接口都是用于集合比较,排序的。那这个两个接口有什么区别嘛?什么时候用Comparable接口,什么时候用Comparator接口呢?能否给出两个简单的示例?
作者:
马伟奇
时间:
2011-12-17 00:37
comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
作者:
刘旭
时间:
2011-12-17 12:47
当你自定义一个类时,如果要将这个类添加到TreeSet中,就需要排序。此时,自定义的泪就要实现comparable接口,并重写其中排序的方法。
但是,假如你要将一个不是自己写的类假加入到TreeSet中,类又没有实现comparable,或者已经实现comparable接口,但是你又要按照自己定义的方法排序时,就需要自定义一个实现Comparator 接口的比较器。当两个都存在时,虚拟机按照自定义的比较器排序。
作者:
黑马巩伟伟
时间:
2011-12-17 19:47
1.Comparable接口是在java.lang类中的,而Comparator接口是在java.util类中的。
2.Comparable 是在集合内部定义的方法实现的排序,Comparator 是在集合外部实现的排序,所以,如想
实现排序,就需要在集合外定义 Comparator 接口的方法或在集合内实现 Comparable 接口的方法。
3.Comparable 是一个对象本身就已经支持自比较所需要实现的接口(如 String、Integer 自己就可以完
成比较大小操作,已经实现了Comparable接口)
4.Comparator 是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你
可以写一个比较器来完成两个对象之间大小的比较。
作者:
冯瑞君老师
时间:
2011-12-18 12:19
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
Java代码
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/
int compare(Object o1, Object o2);
案例:
Java代码
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator {
public int compare(Object o1, Object o2) {
return toInt(o1) - toInt(o2);
}
private int toInt(Object o) {
String str = (String) o;
str = str.replaceAll("一", "1");
str = str.replaceAll("二", "2");
str = str.replaceAll("三", "3");
//
return Integer.parseInt(str);
}
/**
* 测试方法
*/
public static void main(String[] args) {
String[] array = new String[] { "一二", "三", "二" };
Arrays.sort(array, new SampleComparator());
for (int i = 0; i < array.length; i++) {
System.out.println(array[i]);
}
}
}
二、Comparable
强行对实现它的每个类的对象进行整体排序,实现此接口的对象列表(和数组)可以通过Collections.sort或Arrays.sort进行自动排序。
接口方法:
Java代码
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
int compareTo(Object o);
假设对象User,需要按年龄排序:
Java代码
public class User {
private String id;
private int age;
public User(String id, int age) {
this.id = id;
this.age = age;
}
public int getAge() {
return age;
}
public void setAge(int age) {
this.age = age;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
}
作者:
大梅
时间:
2011-12-18 19:39
当一个自定义的类或者说是一个没有比较性的元素放进集合时,需要通过Comparable或者Comparetor使本无比较性的对象具有比较性。定义类的时候就想到了应该让类的对象具有比较性,可以选择两种接口的任意一个。
在后期使用中,需要改变比较规则(原本有比较规则)或者补充比较规则(原本无比较规则),一般用Comparetor重新定义比较规则,comparetor的比较规则可以覆盖Comparable的compareTo中定义的比较规则。
也就是说Comparetor更常用。
作者:
徐杨
时间:
2011-12-18 20:15
一,让元素自身具备比较性。
也就是元素需要实现Comparable接口,覆盖compareTo 方法。
这种方式也作为元素的自然排序,也可称为默认排序。
二,让容器自身具备比较性,自定义比较器。
需求:当元素自身不具备比较性,或者元素自身具备的比较性不是所需的。
定义一个类实现Comparator 接口,覆盖compare方法。
并将该接口的子类对象作为参数传递给TreeSet集合的构造函数。
当Comparable比较方式,及Comparator比较方式同时存在,以Comparator
比较方式为主。
作者:
曾运
时间:
2011-12-19 01:01
在“集合框架”中有两种比较接口:Comparable接口和Comparator接口。像String和Integer等Java内建类实现Comparable接口以提供一定排序方式,但这样只能实现该接口一次。对于那些没有实现Comparable接口的类、或者自定义的类,您可以通过Comparator接口来定义您自己的比较方式。
Comparable接口
在java.lang包中,Comparable接口适用于一个类有自然顺序的时候。假定对象集合是同一类型,该接口允许您把集合排序成自然顺序。
int compareTo(Object o): 比较当前实例对象与对象o,如果位于对象o之前,返回负值,如果两个对象在排序中位置相同,则返回0,如果位于对象o后面,则返回正值
Comparator接口
若一个类不能用于实现java.lang.Comparable,或者您不喜欢缺省的Comparable行为并想提供自己的排序顺序(可能多种排序方式),你可以实现Comparator接口,从而定义一个比较器。
欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/)
黑马程序员IT技术论坛 X3.2