java compare 接口 (转载)

来源:互联网 发布:宿州云计算 编辑:程序博客网 时间:2024/06/15 08:34
1. 两种比较接口分析
在 “ 集合框架 ” 中有两种比较接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。你选择咖啡还是奶茶
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有两个:
1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
2 Comparable 接口
public interface Comparable<T> {
    publicint compareTo(T o);
}
java.lang. Comparable 接口定义类的自然顺序,实现该接口的类就可以按这种方式排序。  
1 ) int compareTo(Object o): 比较当前实例对象与对象 o ,如果位于对象 o 之前,返回负值,如果两个对象在排序中位置相同,则返回 0 ,如果位于对象 o 后面,则返回正值。
圣经也是神给人的生活指南
2 )在 Java 2 SDK 版本 1.4 中有二十四个类实现 Comparable 接口。下表展示了 8 种基本类型的自然排序。虽然一些类共享同一种自然排序,但只有相互可比的类才能排序。
排序
BigDecimal,BigInteger,Byte,Double, Float,Integer,Long,Short
按数字大小排序
Character
按 Unicode 值的数字大小排序
String
按字符串中字符 Unicode 值排序
利用 Comparable 接口创建自己的类的排序顺序,只是实现 compareTo() 方法的问题。通常就是依赖几个数据成员的自然排序。同时类也应该覆盖 equals() 和 hashCode() 以确保两个相等的对象返回同一个哈希码。
这个接口的作用:如果数组或者集合中的(类)元素实现了该接口的话 , 我们就可以调用 Collections.sort 和 Arrays.sort 排序,或应用于有序集合 TreeSet 和 TreeMap 中。
下面设计一个有序的类 Person ,它实现 Comparable 接口,以年龄为第一关键字,姓名为第二关键字升序排序。
Person.java
package com.zj.sort.comparable;
 
public class Person implementsComparable<Person> {
    privateint age;
    privateString name;
 
    publicPerson( intage, String name) {
       this. age = age;
       this. name = name;
    }
 
    publicint compareTo(Person person) {
       intcop = age- person.getAge();
       if(cop != 0)
           returncop;
       else
           returnname .compareTo(person. name );
    }
 
    publicint getAge() {
       returnage ;
    }
 
    publicString getName() {
       returnname ;
    }
 
    publicint hashCode() {
       intresult = 17;
       result = 37 * result + age ;
       result = 37 * result + name .hashCode();
       returnresult;
    }
 
    publicboolean equals(Object o) {
       if(!(o instanceofPerson))
           returnfalse ;
       Person person = (Person) o;
       return( age == person. age ) && ( name .equals(person. name ));
    }
 
    publicString toString() {
       return( age + "{"+ name+ "}");
    }
}
2.1 测试 Arrays.sort()方法
ArraysSortUnit.java
package com.zj.sort.comparable;
import java.util.Arrays;
import com.zj.compare.Person;
 
public class ArraysSortUnit {
    publicstatic void main(String[] args) {
       Person[] ps = { newPerson(20, "Tom"), newPerson(20, "Jeff"),
              newPerson(30, "Mary"), newPerson(20, "Ada"),
              newPerson(40, "Walton"), newPerson(61, "Peter"),
              newPerson(20, "Bush") };
       System. out.println(Arrays.toString (ps));
       Arrays.sort (ps);
       System. out.println(Arrays.toString (ps));
    }
}
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.2 测试 Collections.sort()方法
CollctionsSortUnit.java
package com.zj.sort.comparable;
import java.util.Arrays;
import java.util.Collections;
import com.zj.compare.Person;
 
public class CollctionsSortUnit {
    publicstatic void main(String[] args) {
       Person[] ps = { newPerson(20, "Tom"), newPerson(20, "Jeff"),
              newPerson(30, "Mary"), newPerson(20, "Ada"),
               newPerson(40, "Walton"), newPerson(61, "Peter"),
              newPerson(20, "Bush") };
       System. out.println(Arrays.toString (ps));
       Collections.sort (Arrays.asList (ps));
       System. out.println(Arrays.toString (ps));
    }
}
结果:
[20{Tom}, 20{Jeff}, 30{Mary}, 20{Ada}, 40{Walton}, 61{Peter}, 20{Bush}]
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.3 测试 TreeSet
TreeSetUnit.java
package com.zj.sort.comparable;
import java.util.TreeSet;
import com.zj.compare.Person;
 
public class TreeSetUnit {
    publicstatic void main(String[] args) {
       TreeSet<Person> set = new TreeSet<Person>();
       set.add( newPerson(20, "Tom"));
       set.add( newPerson(20, "Jeff"));
       set.add( newPerson(30, "Mary"));
       set.add( newPerson(20, "Ada"));
       set.add( newPerson(40, "Walton"));
       set.add( newPerson(61, "Peter"));
       set.add( newPerson(20, "Bush"));
       System. out.println(set);
    }
}
结果:
[20{Ada}, 20{Bush}, 20{Jeff}, 20{Tom}, 30{Mary}, 40{Walton}, 61{Peter}]
2.4 测试 TreeMap
TreeMapUnit.java
package com.zj.sort.comparable;
import java.util.TreeMap;
import com.zj.compare.Person;
 
public class TreeMapUnit {
    publicstatic void main(String[] args) {
       TreeMap<Person, String> map =new TreeMap<Person, String>();
       map.put( newPerson(20, "Tom"), "Tom");
       map.put( newPerson(20, "Jeff"), "Jeff");
       map.put( newPerson(30, "Mary"), "Mary");
       map.put( newPerson(20, "Ada"), "Ada");
       map.put( newPerson(40, "Walton"), "Walton");
       map.put( newPerson(61, "Peter"), "Peter");
       map.put( newPerson(20, "Bush"), "Bush");
       System. out.println(map);
    }
}
结果:
{20{Ada}=Ada, 20{Bush}=Bush, 20{Jeff}=Jeff, 20{Tom}=Tom, 30{Mary}=Mary, 40{Walton}=Walton, 61{Peter}=Peter}
3. Comparator 接口
public interface Comparator<T> {
    intcompare(T o1, T o2);
    boolean
原创粉丝点击