java的Comparator和Comparable
java的Comparator和Comparable
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序。
一、Comparator
强行对某个对象collection进行整体排序的比较函数,可以将Comparator传递给Collections.sort或Arrays.sort。
接口方法:
/**
* @return o1小于、等于或大于o2,分别返回负整数、零或正整数。
*/
int compare(Object o1, Object o2);
案例:
import java.util.Arrays;
import java.util.Comparator;
public class SampleComparator implements Comparator<String> {
public int compare(String o1, String o2) {
return toInt(o1) - toInt(o2);
}
private int toInt(String str) {
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进行自动排序。
接口方法:
/**
* @return 该对象小于、等于或大于指定对象o,分别返回负整数、零或正整数。
*/
int compareTo(Object o);
假设对象User,需要按年龄排序:
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;
}
}
改造后的对象:
import java.util.Arrays;
public class User implements Comparable<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;
}
public int compareTo(User u) {
return this.age - u.getAge();
}
/**
* 测试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users);
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
三、Comparator和Comparable的区别
先看一下使用Comparator对User集合实现排序的方式:一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
在TreeSet和TreeMap中添加的自定义对象必须实现Comparable接口
------------------------------------------------------------
关于引用数据类型的排序(自然排序和客户化排序):
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的(实现其comparTo()方法).
只要实现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.
2.实现Comparator接口的一个实例也可以实现排序功能.
看一下Comparator的全部内容:
public interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
定义了两个方法,我们一般都只需要实现compare方法。
为什么呢?
因为所有自定义类默认extends Object,而Object中已经将equals()实现
Comparator一般都作为一个匿名类出现,对于没有实现Comparable的对象的集合,排序的时候
需要指定一个Comparator.
这里举例说明
对于实现了Comparable的类(自然排序)我们就用最简单的Integer
List list=new ArrayList();
list.add(new Integer(3));
list.add(new Integer(53));
list.add(new Integer(34));
Collections.sort(list);
对于没有实现Comparable的,我们就用Object,按照hashCode大小来排序.
List list= new ArrayList();
list.add(new Object());
list.add(new Object());
list.add(new Object());
Collections.sort(list,new Comparator(){ public int compare(Object o1, Object o2){
return (o1.hashCode()-o2.hashCode());
})
这里定义了一个排序规则,以匿名类的形式出现,当然你也可以定义一个自定义的类实现Comparator,
这样这个“排序规则”就能得以保存。
那Comparable 和 Comparator 接口有什么区别呢?
“白
话文”的解释:用自定义类实现Comparable接口,那么这个类就具有排序功能,Comparable和具体你要进行排序的类的实例邦定。而
Comparator比较灵活,它没有和任何类绑定,实现它的自定义类仅仅定义了一种排序方式或排序规则。不言而喻,这种方式比较灵活。我们的要排序的类
可以分别和多个实现Comparator接口的类绑定,从而达到可以按自己的意愿实现按多种方式排序的目的。Comparable——“静态绑定排
序”,Comparator——“动态绑定排序”。
java的Comparator和Comparable的更多相关文章
- java之Comparator与Comparable
转自:http://blog.csdn.net/zhangerqing 当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定 ...
- Java.lang.Comparable接口和Java.util.Comparator接口的区别
Java的Comparator和Comparable当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序. 1.Com ...
- Java集合中Comparator和Comparable接口的使用
在Java集合中,如果要比较引用类型泛型的List,我们使用Comparator和Comparable两个接口. Comparable接口 -- 默认比较规则,可比较的 实现该接口表示:这个类的实例可 ...
- java List排序方法 Comparator和Comparable
今天写的一个程序中需要对一个List进行排序,突然发现自己对这个问题一无所知,于是查阅资料并进行测试,在此做个记录. Collections工具类中有两个方法可以对List进行排序,分别为: publ ...
- Java中 Comparator接口 与Comparable 的区别
详见:http://blog.yemou.net/article/query/info/tytfjhfascvhzxcyt159 comparator接口与Comparable接口的区别 1. Com ...
- 【java】实现Interface java.lang.Comparable<T>接口的int compareTo(T o)方法实现对象数组或链表或集合的排序,和挽救式对象比较器Interface java.util.Comparator<T>
package 对象比较排序; import java.util.Arrays; class A implements Comparable<A>{ private String name ...
- 【java】TreeSet、Comparable、Comparator、内部类、匿名类
package com.tn.treeSet; public class Student { private String name; private int age; public Student( ...
- java lang(Comparable接口) 和java util(Comparator接口)分析比较
//Comparable 接口强行对实现它的每个类的对象进行整体排序. -- 自然排序.类的compareTo称为自然比较方法. public interface Comparable<T> ...
- Java集合排序方法comparable和comparator的总结
一.概述Comparable和Comparator都是用来实现集合中元素的比较.排序的.Comparable是在集合内部定义的方法实现的排序,位于java.lang下.Comparator是在集合外部 ...
随机推荐
- L-value 和 R-value.
An L-value is something that can appear on the left side of an equal sign, An R-value is something t ...
- 用DOM实现文章采集-HtmlAgilityPack实现html解析
Html Agility Pack 是CodePlex 上的一个开源项目.它提供了标准的DOM API 和XPath 支持! 下载地址:http://htmlagilitypack.codeplex. ...
- PHP 数据库 ODBC
PHP 数据库 ODBC ODBC 是一种应用程序编程接口(Application Programming Interface,API),使我们有能力连接到某个数据源(比如一个 MS Access 数 ...
- This system is not registered with RHN解决方法
root@localhost ipvsadm-1.25]# yum install gcc Loading "security" plugin Loading "rhnp ...
- js 函数参数形式
1. var a = function(b,c){ console.log(arguments);}a("1","cc"); -> ["1&q ...
- asp.net实现 EXCEL数据导入到数据库功能
在项目中经常要用EXCEL导入数据到数据库,提高工作效率. 注意:EXCEL中的第一行不能导入. 下面是源码: IntoExcel.aspx: [csharp] <%@ Page Languag ...
- 正确设置网站title、keywords、description(转载)
本文转载自蚂蚁HR(www.mayihr.com) 优化技巧是老师在课堂上教不了你的,而自己也不可能在练习中领悟,最便捷的方法就是听取别人的经验,所以转载一下 1.title(网站标题) title, ...
- [OSGI]Eclipse4.2 OSGI依赖Bundle
Eclipse 4.2 OSGI 依赖的Bundle: org.eclipse.osgiorg.apache.felix.gogo.runtimeorg.apache.felix.gogo.comma ...
- Day2 数据类型
1.数字:int(整型) 32位机器:-2**31~2**31-1 64位机器:-2**63~2**63-1 float(浮点型) 2.布尔值 真或假 1或0 bool(0) 3.字符串 name = ...
- 嵌入式 python之str操作
1.字符串的对齐方式:①:center(int[,str])>>> string = 'Fishhat'>>> string.center(55)' ...