1

この記事の目次



1.  Setインタフェースのまとめ


Setは重複要素のないコレクションです。SetインタフェースにHashSetクラス、TreeSetクラス、LinkedHashSetクラスがあります。この記事ではSetインタフェースを実装したコレクションクラスの中に最も一般的なHashSetを紹介します。

  • HashSet:重複の要素を許さなく、それぞれの要素に順序がありません
  • TreeMap要素はデフォルトで昇順に並べられ、重複を許可されません
  • LinkedHashSet:予測可能な繰り返し順序をもつ、重複を許可されません。
  • * Setインタフェースが備えるメソッドの一覧

    メソッド 意味 戻り値
    addadd(E e) Setに要素を追加する boolean
    addAll(Collection< ? extends E > c) 指定されたコレクションのすべての要素について、その要素がこのSet内にない場合、Setに追加する boolean
    remove(Object o) 指定された要素がSet内にあった場合、Setから削除する boolean
    removeAll(Collection< ? > c) このSetから、指定されたコレクションに含まれる要素をすべて削除する boolean
    clear() Setからすべての要素を削除する void
    size() Set内の要素数を返す int
    contains(Object o) 指定された要素がSetに含まれている場合にtrueを返す boolean
    containsAll(Collection< ? > c) 指定されたコレクションのすべての要素がこのSetに含まれている場合にtrueを返す boolean
    equals(Object o) 指定されたオブジェクトがSetと同じかどうかを比較する boolean
    isEmpty() このSetに要素が1つも含まれていない場合にtrueを返す boolean
    iterator() Set内の各要素についてのイテレータを返す Iterator< E >

    2.  HashSetの宣言と初期化


    HashSetはSetインタフェースを実装したクラスで、重複の要素を許さなく、それぞれの要素に順序がないクラスです。

    HashSetの宣言:

    HashSet<データ型> 変数名 = new HashSet<>();
    HashSet< String > setStr = new HashSet<>();
    HashSet< Integer > setInt = new HashSet<>();
    HashSet< Date > setDate = new HashSet<>();
    HashSet< Float > setFloat = new HashSet<>();

    3.  要素の格納・追加・取得・取消


     ●  要素を格納・追加する

    HashSet変数名.add(値);
    HashSet変数名.addAll(セット);
    Collections.addAll(HashSet変数名,値1,値2,値3....);
  • addメソッドは指定された要素がHashSetの要素として存在しない場合に、その要素をHashSetに追加します。
  • addAllメソッドは指定されたコレクションのすべての要素について、その要素がこのSet内にない場合、Setに追加します
  • CollectionsクラスのaddAllメソッドはSet型のオブジェクトに要素を一斉に追加するメソッドです。java.util.Collectionsをimportする必要があります。
  • package helloworld;
    
    import java.util.Collections;
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet1 = new HashSet<>();
            //addメソッドでlist1に値を1つずつ追加します
            hashSet1.add(1);
            hashSet1.add(3);
            hashSet1.add(2);
            hashSet1.add(4);
            System.out.println("hashSet1の要素: " + hashSet1);
             
            HashSet< Integer > hashSet2 = new HashSet<>();
            //CollectionsクラスのaddAllメソッドでhashSet2に値を一斉に追加します
            Collections.addAll(hashSet2, 7,8,5,6);
            System.out.println("hashSet2の要素: " + hashSet2);
            
            //addAllでhashSet1にhashSet2を追加します
            hashSet1.addAll(hashSet2);
            System.out.println("addAllでhashSet1にhashSet2を追加した: " + hashSet1);
            
        }
        
    }

    コメント

  • 上記例ではHashSetオブジェクトhashSet1,hashSet2に4つの要素が追加されますが、順序は保持されませんので、要素は必ずしも追加した順とはなりません。
  • ArrayListはsetメソッドとCollections.fill()メソッドで要素を書き換たり、getメソッドで要素を取り出したりすることができますが、HashSetはそれらのメソッドが使えません。要するに、HashSetの要素の順序がないため、要素の位置に関わるメソッドは使えません。
  •  ●  要素を取り出す

    * 拡張for文を用いたHashSet要素の取り出し

    for(HashSet要素の型 e:  HashSet変数名){
        //e で要素を読み書き
    }

    HashSetに使う拡張for文はArrayとArrayListに使う拡張for文と似ていますので楽勝ですね。

     拡張for文を用いたリスト要素の取り出しについて詳しく見たい方:

    拡張for文を用いたリスト要素の取り出し

    ../../../java/java-collection-arraylist.html?goto=4to2

    この記事ではListを実装したクラスの一つであるArrayListを紹介します。ArrayListは大きさが可変という点でたくさんの応用があるので、開発現場でよく・・・
    package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
             
            //拡張for分でhashSetの要素を取り出す
            for(Integer e : hashSet){
                System.out.println(e);
            }
            
        }
        
    }

    * イテレータを用いたSet要素の取り出し

    Iterator< HashSet要素型 > it = HashSet変数名.iterator();
    while(it.hasNext()){
        HashSet要素型 e = it.next();
        //要素 e を用いた処理
    }
  • Iterator(イテレータ)とはSetコレクションの要素を処理する場合に使用します。
  • hasNextメソッド:次の要素数がある場合にtrueを返すメソッドです
  • nextメソッドは次の要素を取得する場合に用いるメソッドです。
  • java.util.Iteratorをimportする必要があります。
  • Set用の反復子のSetIterator インタフェースのメソッド:

    メソッド メソッドの意味 戻り値型
    hasNext() 順方向に次の要素を持っている場合にtrueを返す boolean
    hasPrevious() 逆方向に次の要素を持っている場合にtrueを返す boolean
    next() Set内の次の要素を返す E
    nextIndex() 次のnextで返されることになる要素のインデックスを返す int
    previous() Setの前の要素を返す E
    previousIndex() 次のpreviousで返されることになる要素のインデックスを返す int
    remove() next/previousが返した最後の要素をSetから削除する void
    package helloworld;
    
    import java.util.HashSet;
    import java.util.Iterator;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
             
            //IteratorでhashSetの要素を取り出す
            Iterator< Integer > it = hashSet.iterator();
            while(it.hasNext()){
                 
                Integer e = it.next();
                System.out.println(e);
                 
            }
            
        }
        
    }

     ●  要素を削除する

    * 指定の要素を削除する

    HashSet変数名.remove(要素);
  • removeメソッドはSetに該当の要素が含まれている場合に要素を削除します。指定の要素が含まれていない場合はfalseを返します。
  • Listのremove()メソッドの引数は要素の位置ですが、HashSetでは削除したい要素ですので、要注意です。
  • * clear()で全ての要素を削除する

    HashSet変数名.clear();
    package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
             
            //hashSetの全要素をコンソールに出力する
            System.out.println("元のhashSet全要素:" + hashSet);
            
            //hashSetの要素「3」を削除する
            hashSet.remove(3);
            //hashSetの全要素をコンソールに出力する
            System.out.println("\nremove(3)をした後のhashSet全要素:" + hashSet);
            
            //clearで全要素を削除する
            hashSet.clear();
            //hashSetの全要素をコンソールに出力する
            System.out.println("\nclear()をした後のhashSet全要素:" + hashSet);
        }
        
    }

    実行結果:
    元のhashSet全要素:[1, 2, 3, 4]
    
    remove(3)をした後のhashSet全要素:[1, 2, 4]
    
    clear()をした後のhashSet全要素:[]

    4.  主に使われているメソッド


     ●  size()で要素数を取得する

    HashSet変数名.size();
  • sizeメソッドはSetの要素数を取得する場合に使用します。 Setを初期化直後にsizeメソッドを使った場合は0を返してくれます。
  • package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            //hashSetの要素数をコンソールに出力する
            System.out.println("hashSetの初期化直後のサイズ:" + hashSet.size());
            
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
             
            //hashSetの要素数をコンソールに出力する
            System.out.println("hashSetに要素を追加した後のサイズ:" + hashSet.size());
        }
        
    }

    実行結果:
    hashSetの初期化直後のサイズ:0
    hashSetに要素を追加した後のサイズ:4

     ●  contains()で要素の有無を確認する

    HashSet変数名.contains(値);
  • containsメソッドは指定した値がSet内にあるかないか判定する
  • 指定された要素がSetに含まれている場合にtrueを返します。
  • package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
            
            System.out.println("hashSetの全要素: " + hashSet);
             
            if(hashSet.contains(2)){
               System.out.println("要素2が見つかりました");
            }else{
                System.out.println("要素2が見つかりませんでした");
            }
        }
        
    }

    実行結果:
    hashSetの全要素: [1, 2, 3, 4]
    要素2が見つかりました

     ●  isEmpty()で空Setか確認する

    HashSet変数名.isEmpty(値);
  • isEmptyメソッドは指定したSetは空Setかを確認します
  • このSetに要素が1つも含まれていない場合にtrueを返します。
  • package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            System.out.println("hashSetの全要素: " + hashSet);
            if(hashSet.isEmpty()){
                System.out.println("hashSetは空Setです");
            }else{
                System.out.println("hashSetは空Setではありません");
            }
            
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
            
            System.out.println("hashSetの全要素: " + hashSet);
            if(hashSet.isEmpty()){
                System.out.println("hashSetは空Setです");
            }else{
                System.out.println("hashSetは空Setではありません");
            }
        }
        
    }

    実行結果:
    hashSetの全要素: []
    hashSetは空Setです
    hashSetの全要素: [1, 2, 3, 4]
    hashSetは空Setではありません

     ●  toArray()でHashSetから配列に変換する

    HashSet変数名.toArray(配列変数名);
  • toArray()メソッドはHashSetから配列に変換するメソッドです。
  • 配列の要素数は固定ですので、変換する前に、HashSetのサイズと合わせて、配列を宣言しておく必要があります。
  • package helloworld;
    
    import java.util.HashSet;
    
    public class HelloWorld {
          
        public static void main(String[] args) {
            
            HashSet< Integer > hashSet = new HashSet<>();
            
            //addメソッドでhashSetに値を1つずつ追加します
            hashSet.add(1);
            hashSet.add(3);
            hashSet.add(2);
            hashSet.add(4);
            
            System.out.println("hashSetの全要素: " + hashSet);
            
            //Integer型の配列を宣言する。配列の要素数とHashSetのサイズと一致するように。
            Integer[] array = new Integer[hashSet.size()];
            
            //HashSetから配列に変換する
            hashSet.toArray(array);
            
            System.out.print("配列の全要素: ");
            for(Integer temp : array){
                System.out.print(temp + " ");
            }
        }
        
    }

    実行結果:
    hashSetの全要素: [1, 2, 3, 4]
    配列の全要素: 1 2 3 4

    5.  まとめ


    ここまではHashSetについて意味、宣言、使い方、関わるメソッドなどを紹介しました。特に、HashSetの要素の追加・取得・削除仕方は一般的な知識ですので、覚えておいてください。

    6.  演習問題


    広告