🐷

夏休みなのでList・Set・Mapの違いについて詳しくなってみる

に公開

それぞれの特徴

List・Set・Mapの特徴を表にまとめてみました。

系統 説明 読み取り専用(immutable) 変更可能(mutable)
List 順序あり・重複OK。インデックスでアクセス可能。 List<T> MutableList<T>
Set 順序なし・重複なし。要素は一意。 Set<T> MutableSet<T>
Map キーと値のペア。キーは一意、値は重複可。 Map<K, V> MutableMap<K, V>

問題1

以下のケースにおいて、List・Set・Mapどれを使うべきか?
(1)参加者名簿を作成したい(同じ人を2人登録しない)
(2)名前から電話番号を素早く検索したい
(3)買い物かごにリンゴを3個入れる処理
(4)インデックス番号でアクセスしたい
(5)AクラスとBクラスの両方にいる生徒を求めたい

答え

(1)Set
  データの中に重複した参加者が含まれていても、要素としては1つになる

(2)Map
  キーに名前、値に電話番号のように登録すれば、名前から電話番号が検索できる。
 ただし、キーは重複できないので、同じ人を複数登録できない。
(3)List
  listOf("りんご","りんご","りんご")とすることで、リストの中にりんごを3個入れられる
(4)List
  インデックス番号を持っているのはリストだけ
(5)Set
  AクラスのセットとBクラスのセットを作り、intersectで両方にいる人を取得

fun main() {
    val classA = setOf("青山", "山田", "清水")
    val classB = setOf("山田", "佐藤", "清水")

    val bothClasses = classA intersect classB
    println("両方にいる人: $bothClasses")
}

👉両方にいる人: [山田, 清水]

問題2

同じデータを持つListとSetがある。
それぞれの要素、要素数、3番目の要素はどのように出力されますか?

fun main() {
    // 同じデータを List と Set に入れてみる
    val fruitsList = listOf("メロン","りんご", "バナナ", "りんご", "みかん","りんご")
    val fruitsSet = setOf("メロン","りんご", "バナナ", "りんご", "みかん","りんご")

    println("=====List=====")
    println(fruitsList)
    println(fruitsList.size)
    println(fruitsList[2])  //3番目の要素はindex番号は2

    println("=====Set=====")
    println(fruitsSet)
    println(fruitsSet.size)
    println(fruitsSet[2])
}
答え

このままでは実行できません。
println(fruitsSet[2])がエラーになるからです。
つまり、セットはインデックス番号で要素にアクセスできないことがわかります。
ただし、バナナがこのセットの中に存在しているかどうかは以下のように確認できます。
println("バナナ" in fruitsSet)

println(fruitsSet[2])println("バナナ" in fruitsSet)に変更して
実行した結果は以下のようになります。👇👇👇
=====List=====
[メロン, りんご, バナナ, りんご, みかん, りんご]
6
バナナ
=====Set=====
[メロン, りんご, バナナ, みかん]
4
true

問題3

あるスーパーで販売されている商品の名前をリストにして、以下を出力してください。
商品は、りんご、バナナ、みかん、りんご
(1)このリストの要素数
(2)2番目の要素

答え

listOfでリストを作成できます。
要素数はsizeで取得でき、〇番目の要素は[]の中にindexを指定することで取得できます。
indexは0から始まるので、2番目の要素を取得したいときは、index=1となります。

fun main() {
    val list = listOf("りんご","バナナ","みかん","りんご")
    println("(1)の答え:${list.size}")
    println("(2)の答え:${list[1]}")
}

(1)の答え:4
(2)の答え:バナナ

問題4

(1)問題3のリストから、重複をなくしてSetに変換してください。
(2)セットの中にバナナが含まれているかどうかを出力してください。

答え

Setへの変換はtoSet()を使います。

fun main() {
    val list = listOf("りんご","バナナ","みかん","りんご")
    val set= list.toSet()
    println(set)
    println("バナナ" in set)
}

[りんご, バナナ, みかん]
true

問題5

(1)以下フルーツにそれぞれに価格をつけてMapにしてください。
  りんご=100円、バナナ=120円、みかん=80円
(2)Map全体を出力してください。
(3)リンゴの価格を出力してください。

答え

マップを作るにはmapOf関数を使います。
■書式: mapOf(key to value)

fun main() {
    val fruitMap = mapOf("りんご" to 100,"バナナ" to 120, "みかん" to 80)
    println(fruitMap)
    print("りんごの価格:${fruitMap["りんご"]}円")
}

最後に

それぞれの特徴がわかるように簡単な問題で並べてみました!

Discussion