19.0407

Set

Set も、List/リスト の、仲間です。
つまり、データの集まり、プログラミング用語 では、
  コレクション/Collections
という、カテゴリー/分類 になります。
でも、配列 は、使う側から見れば、仲間に入れたいですが、
配列は、classインスタンス、ListやSet は、インターフェイス/interface が、
ルーツなので、これから先、その違いに気づいていくと思われます。
(実は、私も詳しくない、、勉強しておきます)
また、この次に学習する、Map も、コレクション です。
Map の、学習が終わった時点で、この3つの違い、特徴など、を、
まとめたいと思っています。

では、まず、List とは、どう違うのか?についてから始めましょう。

List は、「順序付きコレクション」 とも、呼ばれます。
それに対して、Set には、順番は、ありません。

まず、その違いを、コードを使って、検証してみましょう

残念、これでは、証明できませんでした。
「やさしいKotlin入門」 にも、書いてあったのですが、
これは、PCの実行環境によるそうです。
また、Setインスタンス の メソッド には、インデックス/index 関係の、
メソッド は、ない、はず、、です。
インデックス がなければ、使えるわけがありませんから。

それは、さておき、ここで覚えるべき、大事なことが出てきました。
それは、
  Setインスタンス の、作成方法
です。
こんなコードで作っていますね。
  val setSample = setOf("monkey", "cat", "dog", "fox")
    / setOf(要素s) ですね。
これを、省略せずに書くと、
  val setSample: Set<String> = setOf("monkey", "cat", "dog", "fox")
これに関しては、「33. ジェネリクス」 のところで、学習してから、見直しておいてください。

これらのコードを見ると、「同じ型でないといけないのか?」 と思いますが、
私には、実用レベルでのことは、分からないのですが、
いろいろな型をまぜても、こう書けば、OKです。
  val setSample2: Set<Any> = setOf("monkey", 1, true, 'f')
ここのところも、「28. Anyクラス」 のところを、学習した後、再度、見てほしいです。

Set も、List と同様に、
  読み取り専用
です、、つまり、
  データの、追加・削除 は、出来ない
ということです。

またまた、MutableList と、同様に、
  MutableSet
では、
  データ の、追加・削除 が、出来る
ことになっています。

MutableSet では、次のメソッドが、サポートされています。
  add(追加する要素)
  remove(削除する要素)
リファレンスとしては、このページの中に、ありますね。
ここでは、
  add(element E)
  remove(element E)
と、ありますが、ここでの、E とは、後で学習する、ジェネリクス で、タイプ/type の時は、T
要素/element の時は、E が、慣例のようです。

と、ここまで、読んできて、これなら、MutableSet よりも、MutableList の方が、いいのでは?
インデックス を、サポートしている分だけ。
と、、お思いでしょうが、Set/MutableSet には、利点があります。
それは、
  Set は、検索 が、早い
ということです。
理由は、「ハッシュ値 が、どうのこうの」 ということです。
これじゃ分からないと思いますが、私も分かりません。
ただ、たとえ、理由が分からなくても、
  Set は、検索が早い
ということを、知っていることには、十分な価値がありますね。
もちろん分かっているに越したことはありません。
ただ、このメリットは、例えば、1万データ とかの場合だそうです。
もちろん、仕事でコードを書く方には、十分知っておく価値がありそうです。
また、インデックスが、必要でないのなら、
気持ち的にも、Set を、使いたいですね。

最後に、
Set/MutableSet での、検索方法を、試してみましょう
コードを見てお分かりの通り、検索するためには、
  contains(検索する要素)
を、使います。

最後の最後に、、あと一つ大事なことがあります、、
Set は、インデックス が、ありませんので、
普通は、同じデータが、複数あっても、無駄な場合が、多いと思います。
それで、
  同じ要素は、重複できない
ことになっています。
参考までに、このコードを、見てみましょう。
また、Carクラス の例は、ここでは、参考までに見ておいてください。
この結果は、有意義なのかも、まだ私には、分かりませんので。
なお、全くカラーがなくて読みにくいと思われた方は、Ctr+A で、すべて選択、
Ctr+C で、コピー、
それから、「TryKotlin」 に、貼り付けてみてください。



まとめ
・List、Set では、どちらが、順序付きで、どちらが、順序なし ですか?
  / 順序付き だと、index/インデックス が、使えます.
・Set、MutableSet インスタンス を、作成するには、それぞれ、
  setOf(要素s)
  mutableSetOf(要素s) // 本文の中では、明示 は、してありませんでした。
    / 小文字で始まります.
・Set/List は、「読み取り専用」で、要素の追加・削除 は、出来ません。
・MutableList/MutableSet は、要素の、追加・削除 が、出来ます。
・MutableSet では、次のメソッドが、サポートされています。
  add(追加する要素)
  remove(削除する要素)
・検索する時には、Setグループ の方が、早いです、、覚えておきましょう。
・検索する時の、メソッドは、List、Set とも、contains(検索する要素) です。
・Set は、同じ要素 は、重複させない。