- 浏览: 290524 次
- 性别:
- 来自: 杭州
文章分类
最新评论
-
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 1189http://wwty.iteye.com/blog/7246 ... -
子类重写父类的方法时声明抛出异常不能比父类范围大
2011-10-09 23:29 1676http://hi.baidu.com/lurim/blog/ ... -
Java中类对象之间的类型转换
2011-05-23 10:46 1099http://hi.baidu.com/angel%B5%C4 ... -
jdbc批量插入数据库
2011-05-23 10:44 934http://apps.hi.baidu.com/share/ ... -
jdk 的动态代理和CGLIB代理
2011-03-19 21:35 3834jdk的代理分为静态代理和动态代理,静态代理用的很少,一般都是 ... -
Java 反射经典实例
2011-03-19 21:28 1035http://tonyaction.blog.51cto.co ... -
JDK、JRE、JVM之间的关系
2011-03-19 15:49 1040http://www.cjsdn.net/post/view? ... -
Java和Tomcat类加载机制
2011-03-19 15:05 1639阿里的面试题,当场晕 ... -
JAVA RMI 实例
2011-03-14 23:29 1076[转]http://damies.iteye.com/blog ... -
Clone使用方法详解
2011-03-11 21:30 1115网新一笔试题,关于clone()的,糊里糊涂不会,看了这文章, ... -
JAVA基础--JAVA中的反射机制详解
2011-03-06 16:57 1067【转】http://java.ccidnet.com/art ... -
unicode、ascii、utf-8的关系
2011-01-12 19:46 889http://www.ruanyifeng.com/blog/ ... -
Java中assertion的使用
2011-01-09 19:22 1448assertion的使用是一个复杂的问题,因为 ... -
Java对象的序列化和反序列化实践
2011-01-05 20:59 885当两个进程在进行远程 ... -
Eclipse中的visual editor 下载和安装[亲身体验过]
2010-12-25 12:54 10727装这个插件我从21点一直弄到凌晨1点半,终于搞定!总结来说这么 ... -
关于JAVA的PO与VO
2010-12-20 20:23 1185我一直很矛盾:是否PO ... -
数据库连接池,数据源,数据库连接,JNDI,JAVA
2010-12-20 09:27 1702连接数据库的两种方式: 在Java应用程序中,数据库的连接一 ... -
Java中synchronize的两种用法
2010-12-15 21:13 2565synchronized 关键字,它包括两种用法:synchr ... -
Java创建对象的四种方法
2010-12-13 23:44 1395有4种显式地创建对象的方式: 1.用new语句创建对象,这是最 ... -
Java之static用法(详解)
2010-12-13 22:40 945在Java语言中,static表示 ...
相关推荐
Comparator接口与Comparable接口的区别 Comparator接口与Comparable接口是Java语言中两个重要的接口,它们都是用于比较和排序自定义类的对象的大小的。虽然它们两个都是用于比较的接口,但是它们有着不同的实现方式...
教你学会Comparator和Comparable
`compare`方法用于比较两个对象,规则由你自定义,而`equals`方法则是判断两个Comparator是否相等,通常与`compare`方法的实现有关。 ```java public class MyComparator implements Comparator<MyObject> { @...
在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...
实现 Comparable 接口意味着对象可以与同类的其他对象进行比较,并定义了一个通用的比较规则。当一个类实现了 Comparable 接口,那么该类的对象就可以直接调用 Collections.sort 或 Arrays.sort 进行排序。 例如,...
### Comparable与Comparator的区别详解 #### 一、引言 在Java编程中,为了对自定义对象进行排序,Java提供了两种接口:`Comparable`与`Comparator`。这两种接口各有优势,适用于不同的场景。本文将深入探讨这两种...
Java-中的-Comparator-和-Comparable.md
Comparable 和 Comparator 的区别 Comparable 接口和 Comparator 都可以用于比较和排序,但是它们有着不同的应用场景和设计理念。 Comparable 接口是一种内部比较机制,需要被比较对象的类实现该接口。它提供了一...
`Comparable`和`Comparator`的主要区别在于: 1. **自然顺序 vs 自定义顺序**:`Comparable`提供了对象的自然顺序,而`Comparator`允许你在运行时定义自定义的比较逻辑。 2. **实现方式**:`Comparable`是通过类实现...
在Java编程语言中,Comparable和Comparator是两个非常重要的接口,它们都用于对象的比较和排序。下面是关于这两个接口的详细解释: **Comparable接口** Comparable接口位于`java.lang`包下,它是一个对象自比较的...
与Comparable不同,Comparator不是用于类的实例本身,而是作为一个外部类来比较两个对象。这意味着我们可以在运行时动态地创建Comparator实例,用以根据不同的规则对集合进行排序。这对于需要多套排序规则的场景特别...
Comparable接口定义在`java.lang`包中,它只有一个方法`compareTo(T o)`,用于比较当前对象与另一个对象的大小。当一个类实现了Comparable接口,意味着类的实例可以被自然排序,无需额外的比较器。例如,String类就...
Java 中的 Comparable 和 Comparator 接口都是用于比较和排序的,但是它们之间存在着一些关键的区别。Comparable 是一个排序接口,若一个类实现了 Comparable 接口,就意味着该类支持排序。Comparable 接口仅包含一...
在Java编程语言中,排序是常见的操作,而`Comparable`和`Comparator`接口则是实现对象排序的两种主要方式。这篇文章将深入探讨这两种实现方式及其在实际编程中的应用。 首先,`Comparable`接口位于`java.lang`包下...
1. Comparator 和 Comparable 相同的地方 他们都是java的一个接口, 并且是用来对自定义的class比较大小的, 什么是自定义class: 如 public class Person{ String name; int age }. 当我们有这么一个...
【Comparable和Comparator区分详解】 Comparable接口是Java中用于对象排序的关键接口,主要应用于需要自动排序的场景。当一个类实现了Comparable接口,意味着该类的对象具备内在的比较逻辑,可以直接进行比较。例如...
在Java编程语言中,Comparable和Comparator接口都用于比较对象,但它们之间存在一些关键区别,这对于理解和优化代码的可扩展性至关重要。 首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T...