検索

キーワード


【Java】Setインターフェースと3つの代表的なクラスの使い方

  • 公開日:2020-07-27 15:56:16
  • 最終更新日:2021-01-25 16:45:46
【Java】Setインターフェースと3つの代表的なクラスの使い方

こんにちは、駆け出しプログラマーの若江です!

ここでは初学者として学習を終えた私が、アウトプットの意味も込めてコレクションのSetについてご紹介させていただきます。

できる限り初学者が理解しやすい内容として紹介させていただくので、参考となれば幸いです!


関連記事リンク:コレクションの概要 / 拡張for文とは? / コレクション (List) の特徴や書き方 / コレクション(Queue, DeQue)の特徴や書き方 / コレクション(Map)の特徴や書き方 / コレクション(Iterator)の特徴や書き方

コレクション:Setインターフェース ~代表的な3つのクラスと8つのメソッド~

コレクションインターフェースを継承して作られたのが、Setインターフェースです。

Setインターフェースには格納するデータの重複を許可しない特徴があります。

ここではSetインターフェースを実装したクラスの種類と役割について紹介させていただきます。


Setインターフェースを実装した代表的なクラス

重複データを許可しない可変長配列のクラス HashSet, TreeSet, LinkedHashSet の特徴を見ていきましょう。


HashSet

Setインターフェースを引き継いでいるので、重複データの格納を許可しません。

また格納したデータは順序によって管理されないため、

「データを格納した順に取り出す」など、セット(リスト)からのデータ取り出し順序は保証されません。

実際の基本的な HashList の書き方を確認しておきましょう。

import java.util.Set;
// String型のHashSetインスタンスを生成
Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");

System.out.println(hash); // 結果:順番は管理しないためランダムに a, b, c が表示される

実行結果に b, a, c と表示されました。

順序で管理されていませんね。

ちなみに HashSet は null を1つのみ許容します。


TreeSet

HashSetの機能に昇順ソート機能が付いたクラスをイメージしてください。

TreeSetは重複データを許可せず、更に昇順でデータをソートして管理します。

例えば1~9の数字をランダムに追加した場合でもリストへ格納した後、1~9の昇順に並べ替えます。

サンプルコードを見てみましょう。

import java.util.Set;
// Integer型のTreeSetインスタンスを生成
Set<Integer> tree = new TreeSet<Integer>();

// リストへランダムに数字を追加
tree.add(new Integer(2));
tree.add(new Integer(4));
tree.add(new Integer(6));
tree.add(new Integer(8));
tree.add(new Integer(1));
tree.add(new Integer(3));
tree.add(new Integer(5));
tree.add(new Integer(7));
tree.add(new Integer(9));

System.out.println(tree); // 結果: 1, 2, 3, 4, 5, 6, 7, 8, 9 と表示

リスト内が昇順にソートされているのが確認できます。

また数字型以外に文字型なども(Unicode判定で)昇順ソートができます。

HashSetと違い、TreeSetは null を許容しません。


LinkedHashSet

先ほど紹介したHashSetを継承して機能拡張したクラスがLinkedHashSetです。

HashSetの重複除外機能に追加して、格納されたデータを順序で管理します。

サンプルコードを確認しましょう。

import java.util.Set;
// String型のLinkedHashSetインスタンスを生成
Set<String> linked = new LinkedHashSet<String>();
linked.add("a");
linked.add("p");
linked.add("p"); // 重複
linked.add("l");
linked.add("e");

System.out.println(linked); // 結果: a, p, l, e と表示

重複文字は削除して、更に格納した順番に表示されています。

ただし、ArrayListのように番号を指定してデータを追加することはできません。

またHashSetと同じく null を1つ許容します。



Setを実装したクラスで使われる主なメソッド8つ

ここではSetを実装したクラスでよく使われるメソッドを8つ紹介します。

大きく分けるとコレクション操作には「追加」「削除」「検索」の3つがあります。

「追加」「削除」「検索」操作をベースに以下8つが基本的なメソッドとなります。

 ※ここではサンプルコードのimportを割愛しています。


    add    :追加したいデータが、セット(リスト)内になければデータ追加します。

// String型のHashSetを生成
Set<String> hash = new HashSet<String>();
// 重複要素以外を追加
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);
hash.add("a"); // 重複要素判定

System.out.println(hash); //結果: a, b, c, null が表示される(ランダム順)


   clear   :セット内の全てのデータを削除します。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);
// セット内のデータを確認
System.out.println(hash);

// セット内の全データを削除
hash.clear();
System.out.println(hash); //結果:セットが空になる


contains:指定したデータを、セットが持っていた場合trueを返します。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);
// セット内のデータを確認
System.out.println(hash);

System.out.println(hash.contains("a")); //結果:aを持っているためtrue
System.out.println(hash.contains("d")); //結果:dを持っていないためfalse


isEmpty :セットがデータを持っていない場合にtrueを返します。

// 先ほどのclearの例を引用
Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);
System.out.println(hash);

hash.clear();
System.out.println(hash.isEmpty()); //結果:データを持っていないためtrue

※空文字もしくは、nullだけがセットに存在してもfalse(データを持っている)を返します。


remove :指定したデータをセットが持っていた場合そのデータを削除します。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);
System.out.println(hash);

// データ c を削除
hash.remove("c");
System.out.println(hash); //結果:a, b, null を表示(ランダム順)


    size    :セット内のデータの数を返します。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);

System.out.println(hash.size()); //結果:4を表示


iterator リスト内のデータを1つずつ取り出すといった、for文のような動作をします。

※HashSet, TreeSet, LinkedHashSet で取り出される順が異なります。

◆HashSet:ランダム順に取り出されます。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);

// ランダム順でセット内のデータを取り出す(ランダムにa, b, c, null を表示)
Iterator<String> iterator = hash.iterator();
while(iterator.hasNext()) {
	String str = iterator.next();
	System.out.println(str);
}


◆TreeSet:昇順に取り出されます。

Set<String> hash = new TreeSet<String>();
hash.add("a");
hash.add("c");
hash.add("b");
// 昇順でセット内のデータを取り出す(a, b, c を表示) Iterator<String> iterator = hash.iterator(); while(iterator.hasNext()) { String str = iterator.next(); System.out.println(str); }


◆LinkedHashSet:データを格納した順序に応じてデータを取り出します。

Set<String> hash = new LinkedHashSet<String>();
hash.add("a");
hash.add("b");
hash.add(null);
hash.add("c");

// 格納した順にセットのデータを取り出す(a, b, null, c を表示)
Iterator<String> iterator = hash.iterator();
while(iterator.hasNext()) {
	String str = iterator.next();
	System.out.println(str);
}


toArray :セットを配列へ変換します。

Set<String> hash = new HashSet<String>();
hash.add("a");
hash.add("b");
hash.add("c");
hash.add(null);

// セットをString型の配列へ変換
String[] array = hash.toArray(new String[] {});
System.out.print(Arrays.toString(array));


以上が代表的なメソッドです。



まとめ

Setは重複データを許可しない特徴があります。

Setを実装したHashSetとLinkedHashSetはnullを許容し、

TreeSetとLinkedHashSetは格納するデータの順を管理します。

重複データを格納したくない場合は活用していきましょう。


関連記事リンク

コレクションの概要 / 拡張for文とは? / コレクション (List) の特徴や書き方 / コレクション(Queue, DeQue)の特徴や書き方 / コレクション(Map)の特徴や書き方 / コレクション(Iterator)の特徴や書き方


【著者】

若江

30代で異業種となるIT業界へ転職した駆け出しのプログラマです。これまで主に Java や Ruby、HTML/CSS を使って学習を目的としたショップサイトや掲示板サイトの作成を行いました。プログラマとしての経験が浅いからこそ、未経験者の目線に近い形で基礎の紹介をしていきたいと思います。

よく読まれている記事
【Java】JSPでタグライブラリを使う(JSTL)

【Java】JSPでタグライブラリを使う(JSTL)

こんにちは。エンジニアの新田です!ここでは、システムエンジニアとして働いている私が、システム開発手法や開発言語について紹介していこうと思います。今回は、JSPの標準タグライブラリ「JSTL」について紹介します。Javaについて勉強している方、Webアプリケーションを構築したいと思っている方の参考になれば幸いです!関連記事リンク: 【Java】JSPの基本的な構文/【Java】JSPのアクションタグ

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

【Java】Stringクラス文字列を操作するメソッドの使い方まとめ!実例も紹介!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!そもそもStringとは何?『 String 』... Java言語において文字列のデータ型を指します。基本デ

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

【Java】文字列の置き換え(String#format)!エスケープシーケンスのまとめも!!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!Stringクラスformatメソッドの文字列整形【java.utilパッケージ】Formatterクラスfo

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

【Java】文字列格納後に変更可能!?StringBufferクラスとStringBuilderクラス!

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者にも✅、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!文字列を扱う3つのクラス【java.langパッケージ】java.langパッケージの文字列を扱うクラスにはS

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

【Java】値?変数?型??しっかり解説!『データ型(プリミティブ型と参照型)』

こんにちは。新人エンジニアのサトウです。システムエンジニアとして駆け出したばかりですが、初心者なりの視点でわかりやすい記事を心がけていますので参考になればうれしいです。プログラム初心者✅にも、プログラムに興味がある人✨も、短い時間で簡単にできますのでぜひこの記事を読んで試してみてください!プリミティブ型と参照型プログラム開発では型を持った変数を使ってデータのやり取りをしますが、データ型によって仕様