- 浏览: 285620 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
lsy812198178:
写的很好,有收获
Java内部类的作用 -
JsonLiangyoujun:
关于第四点,同时继承一个类和实现一个接口的话,重写的应该是父类 ...
Java内部类的作用 -
chenluhe123:
非常感谢楼主分享,浅显易懂
Java内部类的作用 -
唐予之.:
学有所获,非常感谢
Java内部类的作用 -
o22221234:
...
Java内部类的作用
当需要排序的集合或数组不是单纯的数字型时,通常可以使用Comparator或Comparable,以简单的方式实现对象排序或自定义排序
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
comparable是通用的接口,用户可以实现它来完成自己特定的比较,而comparator可以看成一种算法的实现,在需要容器集合collection需要比较功能的时候,来指定这个比较器,这可以看出一种设计模式
comparable应该比较固定,和一个具体类相绑定,而comparator比较灵活,它可以被用于各个需要比较功能的类使用。可以说前者属于“静态绑定”,而后者可以“动态绑定”。
一个类实现了Camparable接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用Sort方法排序了。
而Comparator的作用有两个:
1. 如果类的设计师没有考虑到Compare的问题而没有实现Comparable接口,可以通过 Comparator来实现比较算法进行排序
2. 为了使用不同的排序标准做准备,比如:升序、降序或其他什么序
用法:
实现comparable类的实例就是可以排序的,重写compareTo(),只要调用sort(Object[] a)方法就可以,如果没有实现comparable接口,却调用sort(Object[] a)方法就会报错,因为sort()里面用到的mergeSort()方法将a转化成Comparable类型调用compareTo(T o)方法。
例子:
当需要排序的集合或数组不是单纯的数字型时,通常可以使用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 {
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进行自动排序。
接口方法:
/**
* @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 {
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(Object o) {
return this.age - ((User) o).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集合实现排序的方式:
import java.util.Arrays;
import java.util.Comparator;
public class UserComparator implements Comparator {
public int compare(Object o1, Object o2) {
return ((User) o1).getAge() - ((User) o2).getAge();
}
/**
* 测试方法
*/
public static void main(String[] args) {
User[] users = new User[] { new User("a", 30), new User("b", 20) };
Arrays.sort(users, new UserComparator());
for (int i = 0; i < users.length; i++) {
User user = users[i];
System.out.println(user.getId() + " " + user.getAge());
}
}
}
一个类实现了Camparable接口则表明这个类的对象之间是可以相互比较的,这个类对象组成的集合就可以直接使用sort方法排序。
Comparator可以看成一种算法的实现,将算法和数据分离,Comparator也可以在下面两种环境下使用:
1、类的设计师没有考虑到比较问题而没有实现Comparable,可以通过Comparator来实现排序而不必改变对象本身
2、可以使用多种排序标准,比如升序、降序等
本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/turkeyzhou/archive/2009/09/16/4558392.aspx
comparable是支持自比较,而后者是支持外部比较;
comparable& Comparator 都是用来实现集合中的排序的,只是Comparable是在集合内部定义的方法实现的排序,Comparator是在集合外部实现的排序,所以,如想实现排序,就需要在集合外定义Comparator接口的方法compare()或在集合内实现Comparable接口的方法compareTo()。
Comparable是一个对象本身就已经支持自比较所需要实现的接口(如String Integer自己就可以完成比较大小操作)
而Comparator是一个专用的比较器,当这个对象不支持自比较或者自比较函数不能满足你的要求时,你可以写一个比较器来完成两个对象之间大小的比较。
[转]http://jhyimu2005.iteye.com/blog/639470
发表评论
-
JAVA向上转型
2012-03-14 14:47 1138http://wwty.iteye.com/blog/7246 ... -
子类重写父类的方法时声明抛出异常不能比父类范围大
2011-10-09 23:29 1635http://hi.baidu.com/lurim/blog/ ... -
Java中类对象之间的类型转换
2011-05-23 10:46 1066http://hi.baidu.com/angel%B5%C4 ... -
jdbc批量插入数据库
2011-05-23 10:44 889http://apps.hi.baidu.com/share/ ... -
jdk 的动态代理和CGLIB代理
2011-03-19 21:35 3798jdk的代理分为静态代理和动态代理,静态代理用的很少,一般都是 ... -
Java 反射经典实例
2011-03-19 21:28 1008http://tonyaction.blog.51cto.co ... -
JDK、JRE、JVM之间的关系
2011-03-19 15:49 1012http://www.cjsdn.net/post/view? ... -
Java和Tomcat类加载机制
2011-03-19 15:05 1606阿里的面试题,当场晕 ... -
JAVA RMI 实例
2011-03-14 23:29 1042[转]http://damies.iteye.com/blog ... -
Clone使用方法详解
2011-03-11 21:30 1082网新一笔试题,关于clone()的,糊里糊涂不会,看了这文章, ... -
JAVA基础--JAVA中的反射机制详解
2011-03-06 16:57 1033【转】http://java.ccidnet.com/art ... -
unicode、ascii、utf-8的关系
2011-01-12 19:46 852http://www.ruanyifeng.com/blog/ ... -
Java中assertion的使用
2011-01-09 19:22 1418assertion的使用是一个复杂的问题,因为 ... -
Java对象的序列化和反序列化实践
2011-01-05 20:59 856当两个进程在进行远程 ... -
Eclipse中的visual editor 下载和安装[亲身体验过]
2010-12-25 12:54 10688装这个插件我从21点一直弄到凌晨1点半,终于搞定!总结来说这么 ... -
关于JAVA的PO与VO
2010-12-20 20:23 1148我一直很矛盾:是否PO ... -
数据库连接池,数据源,数据库连接,JNDI,JAVA
2010-12-20 09:27 1674连接数据库的两种方式: 在Java应用程序中,数据库的连接一 ... -
Java中synchronize的两种用法
2010-12-15 21:13 2522synchronized 关键字,它包括两种用法:synchr ... -
Java创建对象的四种方法
2010-12-13 23:44 1369有4种显式地创建对象的方式: 1.用new语句创建对象,这是最 ... -
Java之static用法(详解)
2010-12-13 22:40 913在Java语言中,static表示 ...
相关推荐
comparator接口与Comparable接口的区别
java排序Comparator和Comparable
教你学会Comparator和Comparable
java的Comparator和Comparable
Comparable&Comparator区别,看完就明白了
Java-中的-Comparator-和-Comparable.md
NULL 博文链接:https://hellogava.iteye.com/blog/1570101
本文,先介绍Comparable 和Comparator两个接口,以及它们的差异;接着,通过示例,对它们的使用方法进行说明
详细的介绍了Java中Comparable与Comparator的区别
Comparable与Comparator的区别Java开发Java经验技巧共3页.pdf.zip
主要介绍了java 中Comparable与Comparator详解与比较的相关资料,需要的朋友可以参考下
Java中Comparable和Comparator的区别共3页.pdf.zip
通过简单的例子初步了解Comparable和Comparator的使用,注释很详细
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个...
主要介绍了详解Java中Comparable和Comparator接口的区别的相关资料,希望通过本文大家能彻底掌握这部分内容,需要的朋友可以参考下
本文要来详细分析一下Java中Comparable和Comparator接口的区别,两者都有比较的功能,那么究竟有什么区别呢,感兴趣的Java开发者继续看下去吧
要注意的是List,Set,Queue继承了Collection接口,...这里想用一个简单的例子展示一下他们的使用,内容包括:List、Map、Set、Queue,Collections、Comparable与Comparator,排序、搜索,内部类,泛型、重写equals、hashCode
用Comparator 的好处是不需要修改源代码, 而是另外实现一个比较器, 当某个自定义的对象需要作比较的时候,把比较器和对象一起传递过去就可以比大小了, 并