美文网首页
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和泛型

    要实现List进行排序我们看下API文档java.util:Interface Collection,Interf...

  • Collection、泛型

    【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 Collection...

  • Java-泛型

    day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 ...

  • 2019-10-30

    day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 ...

  • day02【Collection、泛型】

    day02【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 教学目标 ...

  • 【Collection、泛型】

    【Collection、泛型】 主要内容 Collection集合 迭代器 增强for 泛型 第一章 Collec...

  • 【Collection、泛型】

    主要内容 Collection集合 迭代器 增强for 泛型 教学目标 能够说出集合与数组的区别 说出Collec...

  • Collection、泛型

    第一章 Collection集合 1.1 集合概述 在前面基础班我们已经学习过并使用过集合ArrayList...

  • Java基础(8)——泛型

    本节内容1.泛型使用2.泛型实战 一、泛型使用1.泛型一般应用于Collection和Map2.使用场景:在定义类...

  • 《Oracle Java SE编程指南》20-05:泛型接口

    内容导航: 前言 1、定义 2、Comparable接口 1、定义 泛型接口与泛型类的概念一样。 2、Compar...

网友评论

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

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