Java Set/HashSetよくある使い方

2009/02/19 13:35Update
TAGS: Java | コレクション | Collection | Set | HashSet | 反復子 | Iterator

Setは重複のないコレクションです。本文はSetおよびその実装の一つHashSetについて、そのよくある使い方を学びます。

特徴


◇ 重複のないコレクション。重複のあるデータを追加しようとしても、追加されません。重複であるかどうかの判定は、格納要素のequalsメソッドで行います。
◇ null要素。null要素を許容しますが、禁止する実装もあります。許容する場合、重複要素を持たないため、null 要素を最大 1 つしか持ちません。因みに、Setインタフェース実装の一つHashSetは、null要素を許容します。なので、格納した要素はnullであることもありますので、細心の注意が必要です。


構造



java.util.Collection        [I]
∟java.util.Set            [I]
 ∟java.util.SortedSet        [I]
 ∟java.util.EnumSet
 ∟java.util.HashSet
 ∟java.util.LinkedHashSet
 ∟java.util.TreeSet

次のサンプルは、HashSetから生成されたSetインスタンスのコレクションに要素の追加、要素の取得・削除などについて簡単に説明しています。

Set/HashSetサンプル


コード
import java.util.HashSet;
import java.util.Iterator;
import java.util.Set;

/**
 * Java Set/HashSetの使い方についてシンプルなサンプル
 *
 * 1)Setインスタンスの生成
 * 2)Setに要素の追加
 * 3)Setから要素の取得
 * 4)Setから要素の削除
 */
public class TestHashSet {
    public static void main(String []args) {
        ////////////////////////////////////
        //1)HashSetからSetのインスタンスを生成
        Set set = new HashSet();    //その他コンストラクタもあります。詳細はAPI DOCを参照
        
        ////////////////////////////////////
        //2)Setに要素の追加
        set.add("Hello Java Set!");   //String型
        Integer age = new Integer(100);
        set.add(age);     //Integer型
        set.add(age);     //同じオブジェクト重複追加
        set.add("Hello Java Set!");     //同じオブジェクト重複追加
        set.add(null);     //null要素
        //set.addAll(Collection);       //コレクション型データを一括追加
        //...   その他型の値の追加もできますよ
        
        
        ////////////////////////////////////
        //3)Setから要素の取得
                
        System.out.println("************** Iterator **************");
        //反復子iteratorによる取得
        Iterator ite = set.iterator();     //実際のプログラム中に、null判定を忘れずに
                                            //コレクションの反復子iterator
        while(ite.hasNext()) {              //ループ
            Object obj = ite.next();        //該当オブジェクト取得
            
            if (obj instanceof String) {    //String型の場合
                System.out.println((String)obj);
            } else if (obj instanceof Integer) {    //Integer型の場合
                System.out.println(((Integer)obj).intValue());
            }
            
        }
        
        System.out.println("************** Set-> Array  / for (Object obj : Object []) **************");
        //Set を 配列に変換
        Object []objs = set.toArray();
        //for ループによる取得
        for (Object obj : objs) {
            if (obj instanceof String) {    //String型の場合
                System.out.println((String)obj);
            } else if (obj instanceof Integer) {    //Integer型の場合
                System.out.println(((Integer)obj).intValue());
            }
        }
        
        System.out.println("************** for (Object obj : set) **************");
        //Setから直接Object要素を取得。Java5から。
        for (Object obj : set) {
            if (obj instanceof String) {    //String型の場合
                System.out.println((String)obj);
            } else if (obj instanceof Integer) {    //Integer型の場合
                System.out.println(((Integer)obj).intValue());
            }
        }
        
        System.out.println("************** Set要素の削除、サイズ、空判定 **************");
        //4)その他
        //Setから要素の削除
        set.remove(0);
        //Setのサイズ取得
        System.out.println("size=" + set.size());
        //要素があるかどうか
        System.out.println("empty=" + set.isEmpty());
        
    }
}


実行結果:
************** Iterator **************
100
Hello Java Set!
************** Set-> Array  / for (Object obj : Object []) **************
100
Hello Java Set!
************** for (Object obj : set) **************
100
Hello Java Set!
************** Set要素の削除、サイズ、空判定 **************
size=3
empty=false

参考資料


Javaコレクション・フレームワーク概要
Iteratorパターン - イテレータ・パターン - オブジェクト指向設計
java.util.Set のAPI doc
java.util.HashSet のAPI doc

有关作者
Syboos.jp編集長AJavaやオープンソース情報の執筆、Webサイトの開発や運営全般の業務に携わる。

Sponsored Link


Comments

用户名 (required)

Email (will not be published) (required)

URL

Evaluation