1. 重複を含む配列 [1, 2, 2, 3, 3, 3] からユニーク数 3 を返す
  2. 空配列 [] のときは 0 を返す
  3. 全部同じ要素 [5, 5, 5, 5] のときは 1 を返す
  4. 重複が無い配列 [1, 2, 3, 4] のときは 4 を返す
  5. 負の数や 0 を含む配列 [-1, 0, -1, 0, 7] のときは 3 を返す
コース一覧
Java 中級:コレクション・Stream・例外処理
Set で重複を排除

Java 中級:コレクション・Stream・例外処理

コレクション、ジェネリクス、例外処理、Stream API、関数型インターフェース、日付処理、ファイル I/O、継承など Java の中級トピックを実践的に学べるコースです。Java の基礎文法とオブジェクト指向を理解している学習者を対象に、現場の Java コードを読み書きするための知識を補強します。約 16 時間 (1 日 30 分 × 32 日) で 64 レッスンを修了でき、修了後は Spring Boot や業務システム開発に必要な Java 力が身につきます。

1
コレクション基礎
01. ArrayList を使う5分
02. List を走査する5分
03. 要素の削除と検索5分
04. HashMap の基本5分
05. Map を走査する5分
06. Set で重複を排除5分
07. Collections クラスの便利メソッド5分
08. コレクション基礎 まとめクイズ5分
2
ジェネリクス
01. ジェネリッククラスを作る5分
02. ジェネリックメソッド5分
03. 境界型パラメータ5分
04. ワイルドカード ?5分
05. Pair<K,V> を作る5分
06. ジェネリクス まとめクイズ5分
3
例外処理
01. try-catch で例外をつかむ5分
02. 複数の catch ブロック5分
03. throws と例外の伝播5分
04. 独自の例外を作る5分
05. try-with-resources5分
06. finally ブロック5分
07. 例外処理 まとめクイズ5分
4
Stream API
01. Stream を作る5分
02. filter で絞り込む5分
03. map で変換する5分
04. reduce で集約する5分
05. collect で集める5分
06. sorted で並び替え5分
07. distinct で重複排除5分
08. limit と skip5分
09. 並列ストリーム5分
10. Stream API まとめクイズ5分
5
関数型インターフェース
01. ラムダ式の基本5分
02. メソッド参照 ::5分
03. Function インターフェース5分
04. Predicate インターフェース5分
05. Consumer と Supplier5分
06. BiFunction と 2 引数の関数5分
07. 関数型インターフェース まとめクイズ5分
6
文字列操作
01. String.format で書式化5分
02. StringBuilder で連結5分
03. 正規表現の基本5分
04. split と join5分
05. 文字列操作 まとめクイズ5分
7
日付と時刻
01. LocalDate で日付を扱う5分
02. LocalDateTime で時刻も扱う5分
03. Duration で時間差を計算5分
04. 日付の書式化とパース5分
05. 日付の加減算5分
06. 日付と時刻 まとめクイズ5分
8
ファイル I/O
01. Files でファイルに書き込む5分
02. ファイルを行単位で読む5分
03. Path でファイルパスを扱う5分
04. BufferedReader と Stream API5分
05. ファイルの存在確認と削除5分
06. ファイル I/O まとめクイズ5分
9
継承とポリモーフィズム
01. extends で継承する5分
02. super で親を呼ぶ5分
03. メソッドのオーバーライド5分
04. abstract で抽象クラス5分
05. interface で契約を定義5分
06. default メソッド5分
07. instanceof と型パターン5分
08. ポリモーフィズムを活かす5分
09. 継承とポリモーフィズム まとめクイズ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 を返すこと

入出力例

uniqueCount([1,2,2,3,3,3]) → 3 uniqueCount([]) → 0 uniqueCount([5,5,5,5]) → 1 uniqueCount([1,2,3,4]) → 4 uniqueCount([-1,0,-1,0,7]) → 3

ヒント

`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 択クイズで確認する。

  • ジェネリッククラスを作る

    型パラメータ `<T>` を使って、任意の型を受け取れるジェネリッククラス `Box<T>` を自分で定義し、文字列を包んで取り出すコードを書いてみよう。

  • try-catch で例外をつかむ

    Java の例外処理の基本となる try-catch 構文を学び、NumberFormatException を捕まえてデフォルト値を返すコードを書いてみよう。

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

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

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

メモ

Set で重複を排除

⌘S で保存