コース一覧
    Java入門:配列とコレクション
    Set で重複を排除

    Java入門:配列とコレクション

    配列とコレクションの扱いを学び、複数のデータを安全に整理・検索・集計できるようにします。

    1
    配列
    01. 配列の基本5分
    02. 配列の要素にアクセス5分
    03. 配列を for で走査5分
    04. Javaで配列の合計・平均を求める方法(forループ)5分
    05. 配列の平均5分
    06. 配列の最大値5分
    07. 配列の線形探索12分
    08. 拡張 for ループ5分
    09. 配列クイズ5分
    10. 第 6 章 まとめクイズ5分
    2
    コレクション基礎
    01. ArrayList を使う5分
    02. List を走査する5分
    03. 要素の削除と検索5分
    04. HashMap の基本5分
    05. Map を走査する5分
    06. Set で重複を排除5分
    07. Collections クラスの便利メソッド5分
    08. コレクション基礎 まとめクイズ5分

    Set で重複を排除

    入れる前に、毎回 contains で確かめている

    同じものを 2 回登録したくないとき、List だとこう書くことになります。

    Java

    if (!sent.contains(address)) {
        sent.add(address);
    }

    List.contains は先頭から 1 件ずつ equals で比べるので、たまっている件数だけ時間がかかります。1 万件たまった状態でさらに 1 万件足すと、比較の回数は 1 億回に近づきます。そのうえ、重複を入れないという約束は if の書き忘れひとつで崩れます。

    java.util.HashSet は、重複を許さないことを入れ物の側が保証してくれる型です。

    add はすでに有る値を黙って捨てる

    Java

    import java.util.HashSet;
    import java.util.Set;
    
    public class Demo {
        public static void main(String[] args) {
            Set<String> sent = new HashSet<>();
            sent.add("a@example.com");
            sent.add("b@example.com");
            boolean added = sent.add("a@example.com");  // false
    
            System.out.println(sent.size());                    // 2
            System.out.println(sent.contains("b@example.com")); // true
        }
    }

    add は追加できたときだけ true を返します。すでに同じ値が入っていれば何も起きず false が返るだけで、例外にはなりません。だから重複を気にせず投げ込んでよく、size() を見れば実際に何種類あったかが分かります。

    contains も HashSet なら件数が増えてもほぼ一定の速さで答えます。あるかどうかを何度も聞くデータは、List ではなく Set に置いておくのが定石です。

    順番は期待できない

    HashSet は要素の並び順を保証しません。回すたびに、あるいはプログラムを動かし直すたびに順番が変わることもあります。

    Java

    Set<String> tags = new LinkedHashSet<>();   // 追加した順に取り出せる
    Set<String> sorted = new TreeSet<>();       // 小さい順に並ぶ

    追加した順に取り出したいなら LinkedHashSet、並べ替えたいなら TreeSet に替えます。メソッドの使い方はどれも同じで、new するクラスを変えるだけです。

    もう 1 つ、Set<int> とは書けません。ArrayList のときと同じで、整数を入れるなら Set<Integer> です。set.add(101) のように普通の数値を渡すぶんには、Java が自動で Integer に包んでくれます。

    課題では、配列に何種類の値が入っていたかを返します。Set の性質だけで答えが出るので、重複しているかどうかを自分で調べる if は 1 つも要りません。空の配列を渡された場合も、特別な場合分けなしで正しい答えになります。

    要件

    1. クラス名は Solution、メソッド名は uniqueCount、戻り値の型は int、引数は int[] arr の 1 つ
    2. 重複を排除した要素数を返すこと。Set (HashSet 推奨) を使って実装する
    3. 空配列を渡されたときは 0 を返すこと

    ヒント

    `int` はジェネリクスにそのまま入れられないので、`Set<Integer>` のようにラッパークラス `Integer` を使います

    拡張 for 文 `for (int n : arr) { seen.add(n); }` で 1 件ずつ追加すると、`Set` が自動で重複をはじいてくれます

    最後に `seen.size()` を返せば OK です。空配列のときも自然に `0` が返ります

    生田 陸人
    監修生田 陸人
    ゆめさくエンジニア / 現役ソフトウェアエンジニア監修者プロフィールを見る →
    編集 ゆめさく編集部·公開 2026/05/19·更新 2026/08/26

    関連レッスン

    • Collections クラスの便利メソッド

      java.util.Collections の sort / max / min / reverse / shuffle を使いこなして、List を自由自在に操作しよう。

    • コレクション基礎 まとめクイズ

      コレクション基礎 (List / Map / Set / Collections) の総まとめ。使い分けと内部の仕組みを 4 択クイズで確認する。

    • Map を走査する

      Map をキーと値のペアでループする方法を学ぼう。entrySet / keySet / values の使い分けと、順序を保証する LinkedHashMap の使い方まで身につける。

    • HashMap の基本

      Java の `HashMap` を使って、キーと値のペアを保存し、商品名から価格を引き出すメソッドを作ろう。

    このレッスンに出てくる用語

    意味があいまいなまま進んだ語は、ここから読み直せます。

    • メソッドクラスに属する関数
    • クラスデータと振る舞いを束ねる単位
    • 配列サイズ固定の同型データの集まり
    • 戻り値呼び出し元への返答を表す点線矢印
    • 引数位置引数=順番で渡す。
    • 素数1 と自分自身でしか割り切れない自然数
    main.java
    エディタを読み込んでいます

    メモ

    Set で重複を排除

    ⌘S で保存