java compare 接口

1. 两种比较接口分析
在 “ 集合框架 ” 中有两种比较接口: Comparable 接口和 Comparator 接口。 Comparable 是通用的接口,用户可以实现它来完成自己特定的比较,而 Comparator 可以看成一种算法的实现,在需要容器集合实现比较功能的时候,来指定这个比较器,这可以看成一种设计模式,将算法和数据分离。 你选择咖啡还是奶茶
前者应该比较固定,和一个具体类相绑定,而后者比较灵活,它可以被用于各个需要比较功能的类使用。
一个类实现了 Camparable 接口表明这个类的对象之间是可以相互比较的。如果用数学语言描述的话就是这个类的对象组成的集合中存在一个全序。这样,这个类对象组成的集合就可以使用 Sort 方法排序了。
而 Comparator 的作用有两个:
1 、如果类的设计师没有考虑到 Compare 的问题而没有实现 Comparable 接口,可以通过 Comparator 来实现比较算法进行排序;
2 、为了使用不同的排序标准做准备,比如:升序、降序或其他什么序。
2 Comparable 接口
public interface  Comparable<T> {
     public int  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  implements  Comparable<Person> {
     private int  age  ;
     private  String  name  ;
 
     public  Person(  int  age, String name) {
        this  .  age  = age;
        this  .  name  = name;
    }
 
     public int  compareTo(Person person) {
        int  cop =  age  - person.getAge();
        if  (cop != 0)
            return  cop;
        else
            return  name  .compareTo(person.  name  );
    }
 
     public int  getAge() {
        return  age  ;
    }
 
     public  String getName() {
        return  name  ;
    }
 
     public int  hashCode() {
        int  result = 17;
       result = 37 * result +  age  ;
       result = 37 * result +  name  .hashCode();
        return  result;
    }
 
     public boolean  equals(Object o) {
        if  (!(o  instanceof  Person))
            return false  ;
       Person person = (Person) o;
        return  (  age  == person.  age  ) && (  name  .equals(person.  name  ));
    }
 
     public  String 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 {
     public static void  main(String[] args) {
       Person[] ps = {  new  Person(20,  "Tom"  ),  new  Person(20,  "Jeff"  ),
               new  Person(30,  "Mary"  ),  new  Person(20,  "Ada"  ),
               new  Person(40,  "Walton"  ),  new  Person(61,  "Peter"  ),
               new  Person(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 {
     public static void  main(String[] args) {
       Person[] ps = {  new  Person(20,  "Tom"  ),  new  Person(20,  "Jeff"  ),
               new  Person(30,  "Mary"  ),  new  Person(20,  "Ada"  ),
                new  Person(40,  "Walton"  ),  new  Person(61,  "Peter"  ),
               new  Person(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 {
     public static void  main(String[] args) {
       TreeSet<Person> set =  new  TreeSet<Person>();
       set.add(  new  Person(20,  "Tom"  ));
       set.add(  new  Person(20,  "Jeff"  ));
       set.add(  new  Person(30,  "Mary"  ));
       set.add(  new  Person(20,  "Ada"  ));
       set.add(  new  Person(40,  "Walton"  ));
       set.add(  new  Person(61,  "Peter"  ));
       set.add(  new  Person(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 {
     public static void  main(String[] args) {
       TreeMap<Person, String> map =  new  TreeMap<Person, String>();
       map.put(  new  Person(20,  "Tom"  ),  "Tom"  );
       map.put(  new  Person(20,  "Jeff"  ),  "Jeff"  );
       map.put(  new  Person(30,  "Mary"  ),  "Mary"  );
       map.put(  new  Person(20,  "Ada"  ),  "Ada"  );
       map.put(  new  Person(40,  "Walton"  ),  "Walton"  );
       map.put(  new  Person(61,  "Peter"  ),  "Peter"  );
       map.put(  new  Person(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> {
     int  compare(T o1, T o2);
     boolean
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值