Java アドバンス

Java HashSet

1. Java HashSet

HashSetは、すべての要素がユニーク(一意)である要素のコレクションです。
java.utilパッケージに含まれており、Setインターフェースを実装しています。

1.1 HashSetの作成

文字列を格納する cars という名前の HashSet オブジェクトを作成する例:

import java.util.HashSet; // HashSetクラスをインポート

HashSet<String> cars = new HashSet<String>(); // HashSetオブジェクトの作成

作成後は、add()contains()remove() などのメソッドを使用して、ユニークな要素のコレクションを管理できます。

2. 要素の追加

HashSetに要素を追加するには、add() メソッドを使用します。

2.1 実装コード例

// HashSetクラスをインポート
import java.util.HashSet;

public class Main {
  public static void main(String[] args) {
    HashSet<String> cars = new HashSet<String>();
    cars.add("Volvo");
    cars.add("BMW");
    cars.add("Ford");
    cars.add("BMW");  // 重複データ
    cars.add("Mazda");
    System.out.println(cars);
  }
}

       注意: 上記の例では "BMW" を2回追加していますが、セットは重複した要素を許可しないため、出力結果には1回しか表示されません。

3. 要素の存在確認

要素が HashSet 内に存在するかどうかを確認するには、contains() メソッドを使用します。

3.1 実装コード例

cars.contains("Mazda");

4. 要素の削除

要素を削除するには、remove() メソッドを使用します。

4.1 特定の要素の削除

cars.remove("Volvo");

4.2 すべての要素の削除

すべての要素を削除するには、clear() メソッドを使用します。

cars.clear();

5. HashSetのサイズ

セット内にいくつのユニークな要素があるかをカウントするには、size() メソッドを使用します。

5.1 実装コード例

cars.size();

       注意: 重複する値はカウントされません。サイズにはユニークな要素のみが含まれます。

6. HashSetのループ処理

拡張for文(for-each loop) を使用して、HashSet の要素をループ処理できます。

6.1 実装コード例

for (String i : cars) {
  System.out.println(i);
}

7. その他の型(ラッパークラス)

HashSet 内の要素は、実際にはオブジェクトです。これまでの例では、"String" 型の要素(オブジェクト)を作成しました。Javaにおいて String はオブジェクト(プリミティブ型ではない)であることを思い出してください。

int のような他の型を使用する場合は、対応するラッパークラス(Wrapper Class)を指定する必要があります。int の場合は Integer を使用します。他のプリミティブ型については、boolean には Booleanchar には Characterdouble には Double などを使用してください。

7.1 Integerオブジェクトを格納する例

import java.util.HashSet;

public class Main {
  public static void main(String[] args) {

    // numbersという名前のHashSetオブジェクトを作成
    HashSet<Integer> numbers = new HashSet<Integer>();

    // セットに値を追加
    numbers.add(4);
    numbers.add(7);
    numbers.add(8);

    // 1から10までの数値のうち、どれがセットに含まれているかを表示
    for (int i = 1; i <= 10; i++) {
      if (numbers.contains(i)) {
        System.out.println(i + " がセット内で見つかりました。");
      } else {
        System.out.println(i + " はセット内に見つかりませんでした。");
      }
    }
  }
}

8. varキーワード

Java 10以降では、型を2回書かずに HashSet 変数を宣言できる var キーワードが使用可能です。コンパイラが代入された値から型を自動的に推論します。

これによりコードは短くなりますが、可読性の観点から依然として完全な型記述を好む開発者も多いです。モダンなJavaでは有効な構文ですので、覚えておくと良いでしょう。

8.1 実装比較

// varを使わない場合
HashSet<String> cars = new HashSet<String>();

// varを使う場合
var cars = new HashSet<String>();

9. Setインターフェース

Javaのコードでは、以下のように SetHashSet の両方が使われているのをよく目にします。

import java.util.Set;
import java.util.HashSet;

Set<String> cars = new HashSet<>();

これは、変数(cars)を Set(インターフェース)として宣言し、そこに HashSet(実際の実装オブジェクト)を格納していることを意味します。HashSetSet インターフェースを実装しているため、このような記述が可能です。

動作は同じですが、このスタイルは「将来的に別の Set 実装(例えば TreeSet など)に変更したい場合」に柔軟性が高まるため、多くのプロフェッショナルな開発者に推奨されています。