C語言中文網 目錄

Java Set集合詳解:HashSet類、TreeSet 類

< 上一頁Java List集合 Java Map集合下一頁 >

Set 集合也實現了 Collection 接口,它主要有兩個實現類:HashSet 類和 TreeSet類。Set  集合中的對象不按特定的方式排序,只是簡單地把對象加入集合,集合中不能包含重復的對象,并且最多只允許包含一個 null 元素。

HashSet 類

HashSet 類是按照哈希算法來存儲集合中的元素,使用哈希算法可以提高集合元素的存儲速度,當向 Set 集合中添加一個元素時,HashSet 會調用該元素的 hashCode() 方法,獲取其哈希碼,然后根據這個哈希碼計算出該元素在集合中的存儲位置。

在 HashSet 類中實現了 Collection 接口中的所有方法。HashSet 類的常用構造方法重載形式如下。
  • HashSet():構造一個新的空的 Set 集合。
  • HashSet(Collection<? extends E>c):構造一個包含指定 Collection 集合元素的新 Set 集合。其中,“< >”中的 extends 表示 HashSet 的父類,即指明該 Set 集合中存放的集合元素類型。c 表示其中的元素將被存放在此 Set 集合中。

下面的代碼演示了創建兩種不同形式的 HashSet 對象。
HashSet hs=new HashSet();    //調用無參的構造函數創建HashSet對象
HashSet<String> hss=new HashSet<String>();    //創建泛型的 HashSet 集合對象

例 1

編寫一個 Java 程序,使用 HashSet 創建一個 Set 集合,并向該集合中添加 5 本圖書名稱。具體實現代碼如下:
public static void main(String[] args)
{
    HashSet<String> bookSet=new HashSet<String>();    //創建一個空的 Set 集合
    String book1=new String("如何成為 Java 編程高手");
    String book2=new String("Java 程序設計一百例");
    String book3=new String("從零學 Java 語言");
    String book4=new String("論 java 的快速開發");
    bookSet.add(book1);    //將 bookl 存儲到 Set 集合中
    bookSet.add(book2);    //將 book2 存儲到 Set 集合中
    bookSet.add(book3);    //將 book3 存儲到 Set 集合中
    bookSet.add(book4);    //將 book4 存儲到 Set 集合中
    System.out.println("新進圖書有:");
    Iterater<String> it=bookSet.iterator();
    while(it.hasNext())
    {
        System.out.println("《"+(String)it.next()+"》");    //輸出 Set 集合中的元素
    }
    System.out.println("共采購 "+bookSet.size()+" 本圖書!");
}

如上述代碼,首先使用 HashSet 類的構造方法創建了一個 Set 集合,接著創建了 4 個 String 類型的對象,并將這些對象存儲到 Set 集合中。使用 HashSet 類中的 iterator() 方法獲取一個 Iterator 對象,并調用其 hasNext() 方法遍歷集合元素,再將使用 next() 方法讀取的元素強制轉換為 String 類型。最后調用 HashSet 類中的 size() 方法獲取集合元素個數。

運行該程序,輸出的結果如下:
新進圖書有:
《如何成為 Java 編程高手》
《從零學 Java 語言》
《Java 程序設計一百例》
《論 java 的快速開發》
共采購 4 本圖書!

注意:在該示例中,如果再向 bookSet 集合中添加一個名稱為“Java 程序設計一百例”的 String 對象,則輸出的結果與上述執行結果相同。也就是說,如果向 Set 集合中添加兩個相同的元素,則后添加的會覆蓋前面添加的元素,即在 Set 集合中不會出現相同的元素。

TreeSet 類

TreeSet 類同時實現了 Set 接口和 SortedSet 接口。SortedSet 接口是 Set 接口的子接口,可以實現對集合進行自然排序,因此使用 TreeSet 類實現的 Set 接口默認情況下是自然排序的,這里的自然排序指的是升序排序。

TreeSet 只能對實現了 Comparable 接口的類對象進行排序,因為 Comparable 接口中有一個 compareTo(Object o) 方法用于比較兩個對象的大小。例如 a.compareTo(b),如果 a 和 b 相等,則該方法返回 0;如果 a 大于 b,則該方法返回大于 0 的值;如果 a 小于 b,則該方法返回小于 0 的值。

表 1 列舉了 JDK 類庫中實現 Comparable 接口的類,以及這些類對象的比較方式。

表1 實現Comparable接口類對象的比較方式
比較方式
包裝類(BigDecimal、Biglnteger、 Byte、Double、
Float、Integer、Long 及 Short)
按數字大小比較
Character 按字符的 Unicode 值的數字大小比較
String 按字符串中字符的 Unicode 值的數字大小比較

TreeSet 類除了實現 Collection 接口的所有方法之外,還提供了如表 2 所示的方法。

表2 TreeSet類的常用方法
方法名稱 說明
E first() 返回此集合中的第一個元素。其中,E 表示集合中元素的數據 類型
E last() 返回此集合中的最后一個元素
E poolFirst() 獲取并移除此集合中的第一個元素
E poolLast() 獲取并移除此集合中的最后一個元素
SortedSet<E> subSet(E fromElement,E toElement) 返回一個新的集合,新集合包含原集合中 fromElement 對象與 toElement
對象之間的所有對象。包含 fromElemen t對象,不包含 toElement 對象
SortedSet<E> headSet<E toElement〉 返回一個新的集合,新集合包含原集合中 toElement 對象之前的所有對象。
不包含 toElement 對象
SortedSet<E> tailSet(E fromElement) 返回一個新的集合,新集合包含原集合中 fromElement 對象之后的所有對
象。包含 fromElement 對象

例 2

本次有 5 名學生參加考試,當老師錄入每名學生的成績后,程序將按照從低到高的排列順序顯示學生成績。此外,老師可以查詢本次考試是否有滿分的學生存在,不及格的成績有哪些,90 分以上成績的學生有幾名。

下面使用TreeSet類來創建Set集合,完成學生成績查詢功能。具體的代碼如下:
import java.util.Iterator;
import java.util.Scanner;
import java.util.SortedSet;
import java.util.TreeSet;
public class Test08
{
    public static void main(String[] args)
    {
        TreeSet<Double> scores=new TreeSet<Double>();    //創建 TreeSet 集合
        Scanner input=new Scanner(System.in);
        System.out.println("------------學生成績管理系統-------------");
        for(int i=0;i<5;i++)
        {
            System.out.println("第"+(j+1)+"個學生成績:");
            double score=input.nextDouble();
            //將學生成績轉換為Double類型,添加到TreeSet集合中
            scores.add(Double.valueOf(score));
        }
        Iterator<Double> it=scores.iterator();    //創建 Iterator 對象
        System.out.println("學生成績從低到高的排序為:");
        while(it.hasNext())
        {
            System.out.print(it.next()+"\t");
        }
        System.out.println("\n請輸入要查詢的成績:");
        double searchScore=input.nextDouble();
        if(scores.contains(searchScore))
        {
            System.out.println("成績為: "+searchScore+" 的學生存在!");
        }
        else
        {
            System.out.println("成績為: "+searchScore+" 的學生不存在!");
        }
        //查詢不及格的學生成績
        SortedSet<Double> score1=scores.headSet(60.0);
        System.out.println("\n不及格的成績有:");
        for(int i=0;i<score1.toArray().length;i++)
        {
            System.out.print(score1.toArray()[i]+"\t");
        }
        //查詢90分以上的學生成績
        SortedSet<Double> score2=scores.tailSet(90.0);
        System.out.println("\n90 分以上的成績有:");
        for(int i=0;i<score2.toArray().length;i++)
        {
            System.out.print(score2.toArray()[i]+"\t");
        }
    }
}

如上述代碼,首先創建一個 TreeSet 集合對象 scores,并向該集合中添加 5 個 Double 對象。接著使用 while 循環遍歷 scores 集合對象,輸出該對象中的元素,然后調用 TreeSet 類中的 contains() 方法獲取該集合中是否存在指定的元素。最后分別調用 TreeSet 類中的 headSet() 方法和 tailSet() 方法獲取不及格的成績和 90 分以上的成績。

運行該程序,執行結果如下所示。
------------學生成績管理系統-------------
第1個學生成績:
53
第2個學生成績:
48
第3個學生成績:
85
第4個學生成績:
98
第5個學生成績:
68
學生成績從低到高的排序為:
48.0    53.0    68.0    85.0    98.0   
請輸入要查詢的成績:
90
成績為: 90.0 的學生不存在!

不及格的成績有:
48.0    53.0   
90 分以上的成績有:
98.0   

注意:在使用自然排序時只能向 TreeSet 集合中添加相同數據類型的對象,否則會拋出 ClassCastException 異常。如果向 TreeSet 集合中添加了一個 Double 類型的對象,則后面只能添加 Double 對象,不能再添加其他類型的對象,例如 String 對象等。
< 上一頁Java List集合 Java Map集合下一頁 >

精美而實用的網站,提供C語言、C++、STL、Linux、Shell、Java、Go語言等教程,以及socket、GCC、vi、Swing、設計模式、JSP等專題。

Copyright ?2011-2018 biancheng.net, 陜ICP備15000209號

底部Logo
极速pk10开户