今回は、「ListとSetの違い」について解説します。
ListとSetは、「コレクション」と呼ばれており、Apex開発でも必ず使用する要素だと思いますが、この2つの違いを明確に説明できますか?
恥ずかしながら自分はパッとこたえられる自信がなかったのでここにまとめます。
ListとSetの違い
まず、結論から。
- List:順序通りに並べられた要素の列(値の重複OK)
- Set:順序がない要素の集まり(値の重複NG)
これで理解できた方は、この後の内容を読み進める必要は特にないと思います(笑)
自分はよくわからなかった組なので、さらに読み進めることにします。
Listとは
まずListに関してですが、
Listとは、下の図のようなものを指します。
それぞれのフルーツ(要素)に前から番号が割り振られ(0始まりな点に注意)、一列に連なっています。
さらに、「リンゴ」という同じ要素が複数ありますが、特に問題なくつながれています。
これがListです。
実際にListを作成して確認してみましょう。
/**********
**List
**********/
List<String> fruitList1 = new List<String>();
//要素を追加
fruitList1.add('リンゴ');
fruitList1.add('ミカン');
fruitList1.add('リンゴ');
fruitList1.add('モモ');
fruitList1.add('ブドウ');
//リストの中身の確認
system.debug('fruitList1の中身:' + fruitList1);
上のコードでは、「fruitList1」というListに、フルーツ(要素)を順番に入れています。
すべての要素を入れた後に、fruitList1の中身を確認すると、
重複した要素である「リンゴ」が2つとも格納されています。
また、要素を加えた順番通りに入っていますね。そして、順番通りに入っているということはindexを指定して値を取り出すことも可能ということです。
順序通りに並べられていて、値の重複もOK。これがListです。
要素の取り出し方や詳しいListの使い方については、以下の記事をご覧ください。
Setとは
次にSetを見てみましょう。
Listの時と同様、フルーツの要素がありますが、一列に連なっているわけでも、番号が振られているわけでもないですね。
ただの1つのまとまりとして、同じ袋に入れられているような感じです。
さらに、重複した値を同じまとまりに入れることはできないので、リンゴが1つ追い出されてしまっています。
これがSetの特徴です。
こちらも同様にデータで確認してみましょう。
/**********
**Set
**********/
Set<String> fruitSet1 = new Set<String>();
//要素を追加
fruitSet1.add('リンゴ');
fruitSet1.add('ミカン');
fruitSet1.add('リンゴ');
fruitSet1.add('モモ');
fruitSet1.add('ブドウ');
//リストの中身の確認
system.debug('fruitSet1の中身:' + fruitSet1 );
上のコードでは、「fruitSet1」というSetに、フルーツ(要素)を順番に入れています。
すべての要素を入れた後に、debugでfruitSet1の中身を確認すると、
「リンゴ」を2つ入れたはずなのに、1つしか入っていませんね。
また、「リンゴ」→「ミカン」の順番で要素を入れたにもかかわらず、「ブドウ」が先頭に来ています。
順番がないのでListのようにindex指定して要素を取り出すことはできません。
要素に順番がなく、重複の値はNG。これがSetです。
詳しいSetの使い方については、以下の記事をご覧ください。
ListとSetの使いわけ
ListとSet、どちらを使うべきか迷った時は、以下の2つの質問に答えるようにします。
- 値の重複があってもよいか?
- 値の順序は重要か?
いずれかの答えが「Yes」の場合はListを使用します。
どちらも「No」の場合は、Setを使用しましょう。
まとめ
今回は、「ListとSetの違い」について解説しました。
もう一度、ListとSetの違いをまとめると、
- List:順序通りに並べられた要素の列(値の重複OK)
- Set:順序がない要素の集まり(値の重複NG)
となります。
状況に応じて使い分けられるように練習ですね。
コメント