HashSetの使い方をまとめました。
HashSetに関する使い方のサイトは他にもありますが、
それらのサイトには書かれていないメソッドについても書いてあります。
HashSetの基本情報
・重複する値を持たない。
・順序は保証しない。
・Nullは値として保持できる。
使い道
和集合の作成
集合A[1, 2, 3]
集合B[2, 4, 6]
A ∩ B = [1, 2, 3, 4, 6](∩ は和集合の記号です)
[2]は重複しているので、1つになります。
積集合も求めることはできます。
retainAllメソッドで可能ですので後述します。
使い方
追加
値の追加(addメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 追加 hash.add(null); hash.add(null); hash.add("1"); hash.add("1"); hash.add("2"); out.println( hash); } } // 実行結果 [null, 1, 2] nullと1は重複しているため、1つになります。 |
Collectionの追加(addAllメソッド)
Colection型であれば追加できます。(もちろん型が一致する必要はありますが)
ここではArrayListとHashMapを追加させています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package samples.collections; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // Collectionを追加 List<String> list = new ArrayList<>(); list.add("3"); list.add("4"); Map<Integer, String> map = new HashMap<>(); map.put(new Integer(1), "AAA"); map.put(new Integer(2), "BBB"); hash.addAll(list); hash.addAll(map.values()); out.println(hash); } } // 実行結果 [AAA, 3, BBB, 4] |
削除
値の全消去(clearメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 値の全消去 hash.add("A"); hash.add("B"); hash.add("C"); out.println("消去前 : " + hash); hash.clear(); out.println("消去後 : " + hash); } } // 実行結果 消去前 : [A, B, C] 消去後 : [] |
値の削除(removeメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 削除 hash.add("A"); hash.add("B"); hash.add("C"); out.println("削除前 : " + hash); hash.remove("A"); out.println("削除後 : " + hash); } } // 実行結果 削除前 : [A, B, C] 削除後 : [B, C] |
対象のCollectionを削除(removeAllメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 対象のCollectionを削除(removeAllメソッド) hash.add("A"); hash.add("B"); hash.add("C"); out.println("削除前 : " + hash); Set<String> removeSet = new HashSet<String>(); removeSet.add("A"); removeSet.add("C"); out.println("削除対象 : " + removeSet); hash.removeAll(removeSet); out.println("削除後 : " + hash); } } // 実行結果 削除前 : [A, B, C] 削除対象 : [A, C] 削除後 : [B] |
条件付き削除(removeIfメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; import java.util.function.Predicate; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 条件付き削除(removeIfメソッド) hash.add("1"); hash.add("2"); hash.add("10"); out.println("削除前 : " + hash); // (例)半角数字1桁に一致する条件を指定 Predicate<String> predicate = arg -> arg.matches("^[0-9]{1}$"); // 条件をセットして削除 hash.removeIf(predicate); out.println("削除後 : " + hash); } } // 実行結果 削除前 : [1, 2, 10] 削除後 : [10] |
判定
等価判定(equalsメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 |
package samples.collections; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashSet; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); Set<String> matchHash = new HashSet<>(); matchHash.add("A"); matchHash.add("B"); matchHash.add("C"); Set<String> partHash = new HashSet<>(); partHash.add("A"); // LinkedHashSet Set<String> matchLinked = new LinkedHashSet<String>(); matchLinked.add("A"); matchLinked.add("B"); matchLinked.add("C"); // ArrayList List<String> matchList = new ArrayList<>(); matchList.add("A"); matchList.add("B"); matchList.add("C"); // 等価判定 out.println("hash : " + hash); out.println("matchHash : " + matchHash + " : " + hash.equals(matchHash)); out.println("partHash : " + partHash + " : " + hash.equals(partHash)); out.println("matchLinked : " + matchLinked + " : " + hash.equals(matchLinked)); out.println("matchList : " + matchList + " : " + hash.equals(matchList)); } } // 実行結果 hash : [A, B, C] matchHash : [A, B, C] : true partHash : [A] : false matchLinked : [A, B, C] : true matchList : [A, B, C] : false 判定対象はSetである必要があります。 また、同じ要素数かつ同じ値をもっている場合にのみTrueを返します。 |
要素数ゼロ判定(isEmptyメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); Set<String> nullSet = new HashSet<>(); nullSet.add(null); // 空値 out.println("hash : " + hash); out.println("isEmpty :" + hash.isEmpty()); out.println(); // Null out.println("nullSet : "+ nullSet); out.println("isEmpty : "+ nullSet.isEmpty()); } } // 実行結果 hash : [] isEmpty :true nullSet : [null] isEmpty : false nullも要素としてカウントされるため、Falseとなる。 |
値を含むか判定(containsメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); // 値を含むかの確認 hash.add("A"); hash.add("B"); out.println("含まれる値 : " + hash); out.println("Aを含むか : " + hash.contains("A")); out.println("Xを含むか : " + hash.contains("X")); } } // 実行結果 含むれる値 : [A, B] Aを含むか : true Xを含むか : false |
指定したCollectionの値を含むか判定(containsAllメソッド)
引数に与えるのはColection型であればOKです。
ここではSet以外でも動作することを確認するため、ArrayListを判定対象のColectionとしています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 |
package samples.collections; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashSet; import java.util.List; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); // ArrayList List<String> matchList = new ArrayList<>(); matchList.add("A"); matchList.add("B"); matchList.add("C"); List<String> partList = new ArrayList<>(); partList.add("A"); partList.add("B"); List<String> umMatchList = new ArrayList<String>(); umMatchList.add("C"); umMatchList.add("D"); List<String> emptyList = new ArrayList<String>(); // 指定したCollection全てが含まれているか確認 out.println("hash : " + hash); out.println("matchList : " + matchList + " : " + hash.containsAll(matchList)); out.println("partList : " + partList + " : " + hash.containsAll(partList)); out.println("umMatchList : " + umMatchList + " : " + hash.containsAll(umMatchList)); out.println("emptyList : " + emptyList + " : " + hash.containsAll(emptyList)); } } // 実行結果 hash : [A, B, C] matchList : [A, B, C] : true partList : [A, B] : true umMatchList : [C, D] : false emptyList : [] : true 完全一致、部分一致、空要素は含むと判定されます。 umMatchList のように、1つでも含まないものがあるとFalse判定となります。 |
繰り返し
拡張For文
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); // 拡張For文 for(String s: hash) { out.println(s); } } } // 実行結果 A B C |
Iterator
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Iterator; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); // Iterator Iterator<String> it = hash.iterator(); while(it.hasNext()) { out.println(it.next()); } } } // 実行結果 A B C |
各要素に対して指定されたアクションを実行(forEachメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; import java.util.function.Consumer; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); // (例)ラムダ式で小文字を表示する処理を指定 Consumer<String> consumer = arg -> out.println(arg + " to Lower : " + arg.toLowerCase()); // 各要素に対して指定されたアクションを実行(forEachメソッド) hash.forEach(consumer); } } // 実行結果 A to Lower : a B to Lower : b C to Lower : c |
ハッシュ・コード値(hashCodeメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); Set<String> emptySet = new HashSet<>(); Set<String> nullSet = new HashSet<>(); nullSet.add(null); // ハッシュ・コード値(hashCodeメソッド) out.println("hash : " + hash.hashCode()); out.println("emptySet : " + emptySet.hashCode()); out.println("nullSet : " + nullSet.hashCode()); out.println("emptySet.hashCode() == nullSet.hashCode() : " + (emptySet.hashCode() == nullSet.hashCode())); } } // 実行結果 hash : 198 emptySet : 0 nullSet : 0 emptySet.hashCode() == nullSet.hashCode() : true そのセット内の要素のハッシュ・コードの合計を返します。 null要素はゼロになるように定義されています。 |
要素数(sizeメソッド)
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 |
package samples.collections; import java.io.PrintStream; import java.util.HashSet; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); // 要素数(sizeメソッド) out.println("hash : " + hash); out.println("hash size : " + hash.size()); } } // 実行結果 hash : [A, B, C] hash size : 3 |
積集合(retainAllメソッド)
2つのCollectionにおいて共通要素だけにします。
対象はCollection型を指定できるため、ArrayListやHashMapとの共通要素を抽出することも可能です。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 |
package samples.collections; import java.io.PrintStream; import java.util.ArrayList; import java.util.HashMap; import java.util.HashSet; import java.util.List; import java.util.Map; import java.util.Set; public class UsageTest { public static void main(String...strings) { PrintStream out = System.out; // HashSet Set<String> hash = new HashSet<>(); hash.add("A"); hash.add("B"); hash.add("C"); Set<String> otherSet = new HashSet<>(); otherSet.add("C"); otherSet.add("D"); // ArrayList List<String> list = new ArrayList<>(); list.add("A"); list.add("C"); // HashMap Map<Integer, String> map = new HashMap<>(); map.put(new Integer(1), "B"); map.put(new Integer(2), "C"); map.put(new Integer(3), "D"); // 共通要素の保持(retainAllメソッド) // HashSet同士 out.println("hash : " + hash); out.println("otherSet : " + otherSet); hash.retainAll(otherSet); out.println("retained : " + hash); out.println(); // ArrayListを指定 hash.add("A"); hash.add("B"); hash.add("C"); out.println("hash : " + hash); out.println("list : " + list); hash.retainAll(list); out.println("retained : " + hash); out.println(); // HashMapを指定 hash.add("A"); hash.add("B"); hash.add("C"); out.println("hash : " + hash); out.println("map : " + map.values()); hash.retainAll(map.values()); out.println("retained : " + hash); } } // 実行結果 hash : [A, B, C] otherSet : [C, D] retained : [C] hash : [A, B, C] list : [A, C] retained : [A, C] hash : [A, B, C] map : [B, C, D] retained : [B, C] |
他の参考サイト
ITSakura – Java HashSetの使い方のサンプル
TechAcademy – JavaのHashSetクラスの使い方を現役エンジニアが解説【初心者向け】
Javaコード入門 – HashSet
コメント