- 浏览: 332169 次
- 性别:
- 来自: 上海
文章分类
最新评论
-
xuanyuanxiaoxue:
...
Android - LayoutInflater -
柴兴博:
不错 多谢
Android 悬浮Activity并可拖动(访悬浮歌词) -
di1984HIT:
写的很好,我收藏一下。
java之动态代理模式(JDK和cglib) -
chinacssnj:
待测试,明天测,测试的结果发给大家
网络开发上传文件到服务器 -
fx_199182:
...
Android之MediaPlayer
当需要排序的集合或数组不是单纯的数字型时,通常可以使用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)方法。
例子:
一。实现comparable接口
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接口
public class Person { String firstname,lastname; Boolean sex; Integer age; public Person(String firstname,String lastname,Boolean sex,Integer age) { this.firstname = firstname; this.lastname = lastname; this.sex = sex; this.age = age; } public String getFirstName() { return firstname; } public String getLastName() { return lastname; } public Boolean getSex() { return sex; } public Integer getAge() { return age; } //为了输入方便,重写了toString() public String toString() { return firstname +" "+lastname+" "+(sex.booleanValue()?"男":"女")+" "+age; } } //end person
下面是要实现比较器
public class Comparators { public static java.util.Comparator getComparator() { return new java.util.Comparator() { public int compare(Object o1, Object o2) { if (o1 instanceof String) { return compare( (String) o1, (String) o2); } else if (o1 instanceof Integer) { return compare( (Integer) o1, (Integer) o2); } else if (o1 instanceof Person) { return compare( (Person) o1, (Person) o2); } else { System.err.println("未找到合适的比较器"); return 1; } } public int compare(String o1, String o2) { String s1 = (String) o1; String s2 = (String) o2; int len1 = s1.length(); int len2 = s2.length(); int n = Math.min(len1, len2); char v1[] = s1.toCharArray(); char v2[] = s2.toCharArray(); int pos = 0; while (n-- != 0) { char c1 = v1[pos]; char c2 = v2[pos]; if (c1 != c2) { return c1 - c2; } pos++; } return len1 - len2; } public int compare(Integer o1, Integer o2) { int val1 = o1.intValue(); int val2 = o2.intValue(); return (val1 < val2 ? -1 : (val1 == val2 ? 0 : 1)); } public int compare(Boolean o1, Boolean o2) { return (o1.equals(o2)? 0 : (o1.booleanValue()==true?1:-1)); } public int compare(Person o1, Person o2) { String firstname1 = o1.getFirstName(); String firstname2 = o2.getFirstName(); String lastname1 = o1.getLastName(); String lastname2 = o2.getLastName(); Boolean sex1 = o1.getSex(); Boolean sex2 = o2.getSex(); Integer age1 = o1.getAge(); Integer age2 = o2.getAge(); return (compare(firstname1, firstname2) == 0 ? (compare(lastname1, lastname2) == 0 ? (compare(sex1, sex2) == 0 ? (compare(age1, age2) == 0 ? 0 : compare(age1, age2)) : compare(sex1, sex2)) : compare(lastname1, lastname2)) : compare(firstname1, firstname2)); } }; } }
//测试
public class Main { public Main() { } public static void main(String[] args) { Person[] person = new Person[] { new Person("ouyang", "feng", Boolean.TRUE, new Integer(27)), new Person("zhuang", "gw", Boolean.TRUE, new Integer(27)), new Person("zhuang", "gw", Boolean.FALSE, new Integer(27)), new text.Person("zhuang", "gw", Boolean.FALSE, new Integer(2)) }; for (int i = 0; i < person.length; i++) { System.out.println("before sort=" + person[i]); } java.util.Arrays.sort(person, Comparators.getComparator()); for (int i = 0; i < person.length; i++) { System.out.println("after sort=" + person[i]); } } }
另一个从网上摘的例子:
1,comparator
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]); } } }
2,comparable
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()); } } }
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()); } } }
从http://hi.baidu.com/kinny/blog/item/4b3eba7e93c453380cd7da16.html
摘的一段:
1.对象本身实现Comparable接口,那么该类的实例就是可以排序的.
有关Comparable: http://blog.csdn.net/treeroot/archive/2004/09/09/99613.aspx
只要实现了Comparable接口,就可以调用Collections的sort方法对集合中的元素排序.
2.指定一个Comparator,也就是实现了Comparator的类的一个实例.
但是Java本身只提供了一个Comparator的实现,就是Collections.reverseOrder().
该方法返回的是一个已经实现了Comparable接口的反序.
看一下Comparator的全部内容:
public interface Comparator {
int compare(Object o1, Object o2);
boolean equals(Object obj);
}
定义了两个方法,其实我们一般都只需要实现compare方法就行了,因为类都是默认从Object继承
所以会使用Object的equals方法.
Comparator一般都作为一个匿名类出现,对于没有实现Comparable的对象的集合,排序的时候
需要指定一个Comparator.
发表评论
-
java clone技术 浅谈
2011-10-23 14:58 9221.java里的clone分为: A:浅复制(浅克隆): ... -
java synchronized详解
2011-10-23 10:31 753记下来,很重要。 Java语言的关键字,当它用来修饰一 ... -
Java 多线程同步 锁机制与synchronized
2011-10-21 17:25 1394打个比方:一个object就像一个大房子,大门永远打开。房子里 ... -
Java多线程编程总结(转载)
2011-10-21 16:54 755http://www.blogjava.net/cmzy/ar ... -
java内部类的总结
2011-10-15 14:42 709从Java1.1开始引入 ... -
java中的io系统详解
2011-10-10 11:26 739参考:http://expert.iteye.com/blog ... -
Java代码编写的30条建议
2011-10-10 10:22 762(1) 类名首字母应该大写 ... -
Java中局部内部类可以访问它所在方法中定义的final修饰的局部变量的合理解释
2011-09-20 11:21 1320标题有点长,可能有点 ... -
六种异常处理的陋习
2011-09-19 14:42 743你觉得自己是一个Java专 ... -
Java中常见的异常
2011-09-19 14:05 964Java 中异常的分类 所有异常,都继承自 ... -
Java异常的分类 .
2011-09-18 21:52 7921. 异常机制 异 ... -
java数组反射
2011-09-13 17:35 2084数组反射 如果因为某种原因,您并不确定参数或对象是不是数组, ... -
Java中反射机制详解
2011-09-13 14:53 1281问题: 在运行时,对一个JAVA类,能否知道属性和方 ... -
java枚举之EnumSet and EnumMap
2011-09-12 20:17 2639一:EnumSet import java.util.*; ... -
java中获取日期函数应用
2011-09-10 17:11 852(1)String类型转换成日期(Date类型) Sim ... -
java 时间格式化问题
2011-09-10 17:05 1000java 时间格式化问题 java.util.*; ... -
Java深度历险之Java泛型
2011-09-10 16:46 726Java泛型(generics)是JDK ... -
Java 集合篇
2011-09-07 18:51 7821. Java集合类库中最重要的两个接口Collec ... -
Java对象初始化顺序
2011-09-06 10:56 1290前几天与fwb同学说起java笔试题,想起这个东西经常被考,重 ... -
全面接触Java集合框架
2011-09-05 23:33 888http://www.iteye.com/topic/1647 ...
相关推荐
* 一个类实现了Comparator接口,那么它就是一个“比较器”。其它的类,可以根据该比较器去排序。 * * 综上所述:Comparable是内部比较器,而Comparator是外部比较器 */ ``` Java 中的 Comparable 和 ...
在Java编程语言中,Comparable和Comparator接口是两个重要的概念,它们都用于对象的排序,但有着不同的使用场景和特点。本文将深入探讨这两个接口的区别,以及它们在实际开发中的应用。 首先,我们来了解一下...
在Java编程语言中,Comparable和Comparator接口是两个非常重要的组件,它们主要用来进行对象的比较和排序。了解它们之间的区别对于提升代码的可维护性和灵活性至关重要。 Comparable接口来源于java.lang包,它定义...
Comparator接口与Comparable接口是Java语言中两个重要的接口,它们都是用于比较和排序自定义类的对象的大小的。虽然它们两个都是用于比较的接口,但是它们有着不同的实现方式和应用场景。 相同之处:Comparator接口...
Comparable 接口和 Comparator 使用示例 在 Java 编程语言中,比较和排序是非常常见的操作。Comparable 接口和 Comparator 是两种常用的比较和排序方式。在本文中,我们将通过实例代码,详细介绍 Comparable 接口和...
#### 三、Comparator接口解析 ##### 1. 概念介绍 `Comparator`接口同样位于`java.lang`包中,它提供了更灵活的方式来比较不同类型的对象。当我们希望根据特定标准(比如按照年龄降序)对对象进行排序时,可以实现`...
Java Comparable及Comparator接口区别详解 Java 中的 Comparable 和 Comparator 接口都是用来比较对象大小的,但是它们之间有着非常重要的区别。 首先,让我们来了解一下 Comparable 接口。Comparable 接口位于 ...
Comparator接口的灵活性在于,我们可以为同一类型的对象创建多个不同的比较器,从而实现多维度、多条件的排序。 总结一下,Comparable接口适用于对象本身具有排序意义的情况,比如根据对象的属性进行自然排序;而...
在Java编程语言中,Comparable和Comparator接口用于对对象进行比较和排序。这两个接口在很多情况下都能派上用场,但它们的应用场景和实现方式有所不同。 首先,Comparable接口是排序接口,意味着一个类如果实现了...
在Java编程语言中,Comparable和Comparator接口用于比较对象的顺序,尤其在进行排序操作时非常关键。两者虽然目的相似,但使用方式和应用场景有所区别。 Comparable接口定义在`java.lang`包中,它只有一个方法`...
在Java编程语言中,排序是常见的操作,而`Comparable`和`Comparator`接口则是实现对象排序的两种主要方式。这篇文章将深入探讨这两种实现方式及其在实际编程中的应用。 首先,`Comparable`接口位于`java.lang`包下...
在Java编程语言中,Comparable和Comparator接口都用于比较对象,但它们之间存在一些关键区别,这对于理解和优化代码的可扩展性至关重要。 首先,Comparable接口是一个排序接口,它定义了一个单一的方法`compareTo(T...
Comparator接口位于`java.util`包下,用于提供一种外部比较的方式,即不改变对象本身,而是通过一个专门的比较器对象来决定两个对象的大小关系。这种设计模式被称为策略模式,它可以灵活地改变对象的排序策略。 当...
Java Comparable和Comparator对比...在实际项目开发过程中,我们经常需要对某个对象或者某个集合中的元素进行排序,使用 Comparable 接口和 Comparator 接口可以实现自定义的排序规则,提高代码的灵活性和可维护性。
在Java编程语言中,`Comparable`接口和`Comparator`接口是两种重要的排序机制,它们用于对集合中的对象进行比较和排序。理解它们的区别对于任何Java开发者来说都是至关重要的。 首先,`Comparable`接口位于`java....
Java 语言中提供了两个比较接口: Comparable 和 Comparator,这两个接口都是用于比较对象的大小顺序的,但它们有着不同的使用场景和实现方式。在本文中,我们将详细介绍这两个接口的区别和使用方法。 Comparable ...
在Java编程语言中,排序是数据处理中一个非常常见的需求,而`Comparator`和`Comparable`接口则是实现排序的关键工具。这两个接口都是用于比较对象,但它们的应用场景和使用方式有所不同。 首先,`Comparable`接口是...
Comparable接口和Comparator接口是Java中用于排序的关键组件,它们在数据结构如数组、集合和映射的排序过程中扮演着重要角色。接下来我们将深入探讨这两个接口的特性、用途以及它们之间的区别。 1. Comparable接口...