美文网首页
collection 5 - Comparable和泛型

collection 5 - Comparable和泛型

作者: SheBang_ | 来源:发表于2016-08-14 16:37 被阅读55次

    要实现List进行排序我们看下API文档
    java.util:
    Interface Collection,Interface Comparator
    Class Collections
    java.lang:
    Interface Comparable

    Class Collections中有个排序方法sort:

    public static <T extends Comparable<? super T>> void sort(List<T> list)
    
    

    这个方法申明说明了以下几个内容:
    1.sort的入参是List
    2.List中放入的类型是T
    3.T是要实现了Comparable接口的类
    4.Comparable的类型参数是T或者是T的父型
    5.上面的Comparable是个接口,为什么用extends ?
    以泛型的观点来说,extends这个关键词代表的“是一个”且适用于类和接口

    所有可以“排序”的类都实现了java.lang.Comparable接口。Comparable接口中只有一个方法,public int compareTo(Object obj): 该方法:
    返回0,表示 this == obj
    返回正数,表示this > obj
    返回负数,表示 this < obj
    实现了Comparable接口的类通过实现compareTo方法从而确定该类对象的排序方式。

    该Name类实现了Comparable接口,重写compareTo方法

    package mashibing.java;
    
    public class Name implements Comparable<Name> {
     private final String firstName,lastName;
     
     public Name(String firstName,String lastName){
      if (firstName == null ||lastName == null)
       throw new NullPointerException();
      this.firstName = firstName;
         this.lastName = lastName;
     }
     
     public String firstName(){return firstName;}
     public String lastName(){return lastName;}
     
     public boolean equals(Object o){
      if (!(o instanceof Name))
       return false;
      Name n= (Name) o;
      return n.firstName.equals(firstName) && n.lastName.equals(lastName);
     }
     
     public int hashCode(){
      return 31*firstName.hashCode() + lastName.hashCode();
     }
     
     public String toString(){
      return firstName + " " + lastName;
     }
     
     @Override
     public int compareTo(Name n) {
      int lastCmp = lastName.compareTo(n.lastName);
      return (lastCmp != 0 ? lastCmp : firstName.compareTo(n.firstName));
     }
    }
    
    

    上面重写的compareTo方法,接收一个Object类,强制将其转换成Name类,先将lastName进行比较,比较使用的是String类的重写的compareTo方法下面展示的是String类别的compareTo方法,取了两个长度值的最小值,依照次序来比较每个char的的值得大小,char中保存的是ACSII的值,直到两个字符的值不一样,否则就返回两个char字符的差值,如果在k大于两个中的最小值的之前还没有返回出来的一个值得话,那么就比较两个长度的大小。

    private final char value[];
    
    public int compareTo(String anotherString) {
            int len1 = value.length;
            int len2 = anotherString.value.length;
            int lim = Math.min(len1, len2);
            char v1[] = value;
            char v2[] = anotherString.value;
    
            int k = 0;
            while (k < lim) {
                char c1 = v1[k];
                char c2 = v2[k];
                if (c1 != c2) {
                    return c1 - c2;
                }
                k++;
            }
            return len1 - len2;
        }
    

    看下下面主程序,使用了Collections.sort(names),对names这个List进行了排序,这个List中的元素是Name类型的,Name按照API的sort的要求实现了Comparable接口重写了compareTo方法。所以可以对该List进行排序。

    import java.util.*;
    
    public class test {
        public static void main(String[] args) {
            Name nameArray[] = {
                new Name("John", "Smith"),
                new Name("Karl", "Ng"),
                new Name("Jeff", "Smith"),
                new Name("Tom", "Rich")
            };
    
            List<Name> names = Arrays.asList(nameArray);
            Collections.sort(names);
            System.out.println(names);
        }
    }
    

    相关文章

      网友评论

          本文标题:collection 5 - Comparable和泛型

          本文链接:https://www.haomeiwen.com/subject/npodsttx.html