【第14章】Setとは?SetとMutableSetについて詳しく解説

【第14章】セットとミュータブルセットについて詳しく解説 基礎勉強
スポンサーリンク
リンコ
リンコ

こんにちは!リンコですピヨ!この記事では自分の勉強の復習もかねて、KotlinでのSetとMutableSetについて詳しく勉強するピヨ!

この第14章では、プログラミング言語であるKotlinのSetとMutableSetについて、一緒に勉強していきましょう。

この記事を読めばプログラミング未経験の方も、Kotlin入門レベルのSetとMutableSetについて1つ1つ理解しながら勉強できると思うので、是非最後まで読んで頂ければと思います。

※この記事で出てくる「サンプルコード」は、記述が長く画面からはみ出ている場合がありますが、横にスライドすると表示されるのでご安心ください。

スポンサーリンク

【Kotlin】Set(セット)とは?

Set(セット)とは?

Kotlinの「Set」とは、どういった時に使う処理なんでしょうか?まずは、Setがどういった処理を行うものなのかを勉強していきましょう。

変数をまとめて管理

Setは、ArrayやListと同じで変数をまとめて管理しておくものになります。

ただし、Setも複数の変数をまとめて格納していくという点ではListに似ていますが、大きく異なる点もあります。

値の追加や削除ができない

セットではリストと同じで値を追加したり削除したりができません

追加や削除をしたい場合は、この記事の後半で勉強する値の変更が可能な「MutableSet」というコレクションを使います。

Setは順序なしコレクション

Listは順序を保持した状態で変数をまとめるので「順序付きコレクション」でした。

それに対してSetは変数の順番を記憶しない「順序なしコレクション」になります。

順序なしコレクションとはどういったものになるのでしょうか?以下を読んで勉強していきましょう。

リンコ
リンコ

Setは順番を記憶しない「順序なしコレクション」ピヨ!

【Kotlin】Setの使い方

Setの使い方

では実際にSetの使い方、記述の仕方を勉強していきましょう。ここでのSetは、Int型を使って説明していきます。

Setの書式

Setを使う場合の書式は以下になります。Setの記述もArrayやListと同様で基本の記述の仕方がありますが、省略もできるので両方の書式を載せておきます。

// 通常のリストの書式
val セット名: Set<型名> = setOf(値1,値2,値3...)
// 省略したリストの書式
val セット名 = setOf(値1,値2,値3...)

上記がセットの書式になり、このように配列やリストと同じでセットでも「: Set<型名>」の部分を省略することもできます。

また配列では「型名ArrayOf」と型によって変えなければいけませんでしたが、リストと同じでセットではどの型でも「setOf」でいいので、間違えなくて済みますね。

リンコ
リンコ

セットの定義はすべて「setOf」で良いピヨ!

Setを使ったコードを記述してみよう

では実際にセットを使ったコードを記述してみましょう。

サンプルコード

以下のサンプルコードでは、5つの数字をセット「num」に格納して、println関数で出力しています。

val num = setOf(1, 2, 3, 4, 5)
println(num)

出力

サンプルコードを実行すると、以下のように出力されます。

[1, 2, 3, 4, 5]

上記を見たらわかりますがセットでは、出力された値に「[]や,」をつけ足して読みやすいようにしてくれるのも特徴です。

このようにセットを使うのは値の順番を覚えておく必要がない場合のみにし、値の順序が重要な場合は、セットではなくリストを使うようにしましょう。

リンコ
リンコ

セットでは値を出力した際に「[]や,」をつけ足して読みやすくしてくれるピヨ!

【Kotlin】MutableSet(ミュータブルセット)とは?

MutableSet(ミュータブルセット)とは?

続いて、Setに似た名前の「MutableSet」とは、どういった時に使う処理なのでしょうか?

セットと同じで順序なしコレクション

ミュータブルセットは、セットと同じで順序なしコレクションになります。

また、出力された値に「[]や,」をつけ足して読みやすいようにしてくれるのも、セットと同じです。

値の増減ができる

セットではできませんが、ミュータブルセットでは値の数を増やしたり減らしたり(削除)することができます。

この値の増減ができるのは、MutableListと同じですね。

リンコ
リンコ

ミュータブルセットでは値の増減ができるピヨ!

【Kotlin】MutableSetの使い方

MutableSetの使い方

では実際にMutableSetの使い方を勉強していきましょう。MutableSetの使い方では、値の増減方法を1つ1つ解説していきます。

MutableSetで値を増減させる書式

MutableSetを使う場合の書式は以下のようになります。

値を代入する場合

まず値を代入する場合は、Setと同じような形の書式になります。

// 通常のミュータブルセットの書式
val ミュータブルセット名: MutableSet<型名> = mutableSetOf(値1,値2,値3...)
// 省略したミュータブルセットの書式
val ミュータブルセット名 = mutableSetOf(値1,値2,値3...)

値を増やす場合

次に値を増やす場合の書式は以下のようになります。

ミュータブルセット名.add(値)

値を指定して削除する場合

続いて値を削除する方法ですが、ミュータブルリストでは削除する方法が2種類ありましたが、ミュータブルセットではインデックス番号が存在しないため「値を指定して削除」の1種類のみになります。

ミュータブルセット名.remove(値)

MutableSetを使ったコードを記述してみよう

では実際にMutableSetを使ったコードを記述してみましょう。

サンプルコード

以下のサンプルコードでは、ミュータブルセットに挨拶の言葉を追加したり、削除しています。

コードと出力を見比べて、どのように動いているか勉強していきましょう。

// 3種類の挨拶をミュータブルリスト「greetings」に代入
val greetings = mutableSetOf("おはよう", "こんにちは", "こんばんは")
// 「おやすみ」を追加
greetings.add("おやすみ")
// 一度「greetings」の中身を出力
for(print in greetings) {
println("あいさつ:${print}")
}
// 値を指定して「こんばんは」を削除
greetings.remove("こんばんは")

println("--------2回目の出力-----------")

// 再度「greetings」の中身を出力
for(print in greetings) {
println("あいさつ:${print}")
}

出力

サンプルコードを実行すると、以下のように出力されます。

あいさつ:おはよう
あいさつ:こんにちは
あいさつ:こんばんは
あいさつ:おやすみ
--------2回目の出力-----------
あいさつ:おはよう
あいさつ:こんにちは
あいさつ:おやすみ

最初に「add」で「おやすみ」が追加され、4つの挨拶が出力されました。

その「remove」で「こんばんは」を削除し、3つの挨拶が出力されました。

リンコ
リンコ

ミュータブルセットではインデックス番号での削除ができないので注意ピヨ!

【Kotlin】SetとListの違いについて

SetとListの違いについて

ここまで勉強してきて、順序付きコレクションなのか順序なしコレクションなのかという違いがあることは分かりましたが、ほとんど使い勝手が一緒です。

他にどのような違いがあるか、最後に勉強していきましょう。

値の存在をチェックする時の処理速度が違う

普通に考えれば、順序がついているリストを使った方が便利に思うと思います。

ですが、セットの方が「値が存在しているかどうかをチェックする際の検索スピードの速さ」が速いというメリットがあります。

配列やリストでは値の先頭から順番に探していく「シーケンシャルサーチ」という検索方法が使われているため、値の数が増えれば増えるほど、検索に時間がかかります。

それに対してセットでは「ハッシュ」という、配列やリストと全く異なる方法で値を検索します。

「ハッシュ」は、特定の値をあるルールに従って別の値にした「ハッシュ値」を求めて記録していきます。

検索する時にこの「ハッシュ値」がセット内に存在しているかどうかチェックするため、検索する処理時間が大幅に短縮されます。

重複した値をaddした時の動作が違う

リストとセットにはもう1つ違いがあり、それは重複した値をaddした時の動作が違うというところです。

リストの場合、既に同じ値が存在していたとしてもaddすると末尾に追加されますが、セットの場合は既に同じ値が存在していると追加しようとしても重複しているため追加されません

サンプルコード

以下のサンプルコードでは、ミュータブルセットとミュータブルリストのそれぞれで、既に存在している「おはよう」を追加しようとしています。

val greetingsSet = mutableSetOf("おはよう", "こんにちは", "こんばんは")
greetingsSet.add("おはよう")
println("-------ミュータブルセットの場合-----------")
println(greetingsSet)
val greetingsList = mutableListOf("おはよう", "こんにちは", "こんばんは")
println("-------ミュータブルリストの場合-----------")
greetingsList.add("おはよう")
println(greetingsList)

出力

サンプルコードを実行すると、以下のように出力されます。

-------ミュータブルセットの場合-----------
[おはよう, こんにちは, こんばんは]
-------ミュータブルリストの場合-----------
[おはよう, こんにちは, こんばんは, おはよう]

このように、ミュータブルセットでは「おはよう」が既に存在しているため追加されませんでしたが、ミュータブルリストでは既に存在していたとしても末尾に追加されました。

リンコ
リンコ

ミュータブルリストとミュータブルセットは似ていても違いはあるから、用途に応じてうまく使い分けるピヨ!

まとめ

まとめ

この記事では、プログラミング言語であるKotlinのSetとMutableSetについて勉強していきましたが、いかがでしたでしょうか?今回の記事をまとめると以下のようになります。

  • セットは順序なしコレクション
  • 出力された値に「[]や,」をつけ足して読みやすくしてくれる
  • ミュータブルセットではインデックス番号での削除ができない
  • セットではハッシュ値を使った検索方法なので検索速度が速い
  • セットでは重複した値は追加されない

今回勉強した「Set」や「MutableSet」はKotlinの入門レベルの知識になるので、何回も読み直してしっかり覚えておきましょう。

リンコ
リンコ

次回の記事では「MapとMutableMap」について勉強していくピヨ!

プログラミング未経験の方や入門レベルの方、Kotlinについて詳しくなりたい方は、また一緒に勉強するピヨ!

コメント

タイトルとURLをコピーしました