セットと対応付けの定義
学習の目的
この単元を完了すると、次のことができるようになります。
- セットと対応付けを作成する。
- リスト、セット、対応付けの違いを説明する。
- リストではなく、セットを使用する状況を判断する。
一緒にトレイルを進みましょう
エキスパートと一緒にこの手順を進めますか? 次の動画をご覧ください。これは Trailhead Live の「Trail Together」(一緒にトレイル) シリーズの一部です。
(この動画は 49:06 の時点から始まります。戻して手順の最初から見直す場合はご注意ください。)
はじめに
すでに学んだとおり、リストは同じデータ型の項目を順序付けたコレクションです。各項目にインデックスという位置が定められています。このため、番号の付いたインデックスを指定してリスト内の項目を簡単に取得できます。けれども、Apex のコレクションはリストだけではありません。他に、セットと対応付けという 2 種類のコレクションがあります。
セット
これまでは、リストという 1 種類のコレクションを作成していました。セットは、同じデータ型の一連の一意の項目で、順序が付いていません。リストと同様、セットも要素という項目の集合体で、どの要素もデータ型 (文字列、整数、場合によっては Account など) は同じです。リストと異なるのは、セットの要素には特定の順序がないことです。セットの要素には順序が付けられていないため、重複する要素を含めることができません。セットに既存の要素を追加しようとした場合、エラーは発生しませんが、新しい値がセットに追加されません。前述のとおり、リストをループ処理するときは常に、リストに追加された順で項目にアクセスします。セットをループ処理するときは、要素に順序が付いていないため、要素にランダムにアクセスすることになります。
セットを宣言することはリストを宣言することと似ていますが、キーワードに List
ではなく Set
を使用します。では、文字列のセットを作成してみましょう。
セットを作成する
- 開発者コンソールで、[File (ファイル)] | [New (新規)] | [Apex Class (Apex クラス)] をクリックします。
- クラス名に「Tea」と入力します。
- [OK] をクリックします。
- Tea クラスのコードを次のコードに置き換えます。
public class Tea{ public static void orderTea(){ Set<String> teaTypes = new Set <String>(); teaTypes.add('Black'); teaTypes.add('White'); teaTypes.add('Herbal'); system.debug(teaTypes); } }
- [File (ファイル)] | [Save (保存)] をクリックします。
コードを実行する
- [Debug (デバッグ)] | [Open Execute Anonymous Window (実行匿名ウィンドウを開く)] をクリックします。
- [Enter Apex Code (Apex コードを入力)] ウィンドウに次のコードを貼り付けます。
Tea.orderTea();
- [Open Log (ログを開く)] を選択し、[Execute (実行)] をクリックします。実行ログが開き、コードの実行結果が表示されます。
- ウィンドウ下部の [Debug Only (デバッグのみ)] を選択します。
デバッグログに、Black (紅茶)、White (白茶)、Herbal (ハーブティー) という 3 種類のお茶が表示されます。
セットのメソッド
コレクションの種別ごとに独自のメソッドがあります。一般的な add
メソッドを使用して、お茶の種類のリストに Black (紅茶)、White (白茶)、Herbal (ハーブティー) を追加しました。セットのメソッドについての詳細は、この単元の末尾の「リソース」を参照してください。
重複した値のセットへの追加
- Tea クラスで、orderTea メソッド (2 ~ 8 行目) を次のコードに置き換えます。
public static void orderTea(){ Set<String> teaTypes = new Set <String>{'Black', 'White', 'Herbal'}; system.debug(teaTypes); teaTypes.add('Green'); teaTypes.add('Black'); system.debug(teaTypes); }
- [File (ファイル)] | [Save (保存)] をクリックします。
コードを実行する
-
Tea.orderTea();
のコードを実行します。
ヒント: [Debug (デバッグ)] | [Execute Last (前回のコードを実行)] をクリックして、実行匿名を使用してすでに実行したコードを再度実行します。このオプションは、メソッドを変更し、同じ方法で再度実行する場合に役立ちます。 - デバッグログを確認します。
4 行目でログに teaTypes
が表示されるため、セットの内容を確認できます。6 ~ 7 行目でセットに Green (緑茶) と Black (紅茶) を追加します。9 行目でログに teaTypes
が表示されるため、セットの内容を再度確認できます。なぜセットに Black (紅茶) が追加されていないのでしょうか?
前述のとおり、セットでは値の重複が認められません。さらに、リストのようにインデックスを付けることもできません。セットは一般に、特定の値が含まれているかどうかを確認するために使用します。
リストにするかセットにするかの選択
ここで、「リストとセットの両方の使い方がわかったけれど、どちらを使うのかはどのように判断するのか?」と思っているかもしれません。その場合は、作成したいコレクションを念頭に次の 2 点を自問します。
- 重複があってもよいか?
- 項目の順序は重要か?
上記のいずれかの答えが「はい」の場合はリストを使用します。どちらの答えも「いいえ」の場合はセットを使用します。
リストとセットについて習得しましたが、コレクションにはもう 1 種類あります。次は、対応付けについて説明します。
対応付け
対応付けは、リストやセットよりも複雑なコレクションです。対応付けの各項目にキーと値の 2 つがあり、キー - 値ペアと呼ばれています。キーと値には任意のデータ型を使用できます。どのキーも一意ですが、対応付け内の値は繰り返し使用できます。電話の国コードの対応付けを考えてみましょう。国コードがキーで、国名が値です。どの国コードも一意ですが、国は重複していても構いません (1 つの国に国コードが複数ある場合があるため)。
put メソッド
キー-値ペアを対応付けに追加するには、次のとおり put
メソッドを使用します。
put
メソッドには、キーと値の 2 つのパラメーターが必要です。では、お茶の種類 (キー) とフレーバープロファイル (値) の対応付けを作成してみましょう。
お茶の種類とフレーバープロファイル
お茶の種類 (キー) |
フレーバープロファイル (値) |
Black (紅茶) |
Earthy (自然な風味) |
Herbal (ハーブティー) |
Sweet (甘美な風味) |
White (白茶) |
Sweet (甘美な風味) |
対応付けを作成する
- Tea クラスで、既存のコードを次のコードに置き換えます。
public class Tea{ public static void orderTea(){ Map <String, String> teaTypes = new Map <String, String>(); teaTypes.put('Black', 'Earthy'); teaTypes.put('White', 'Sweet'); teaTypes.put('Herbal', 'Sweet'); system.debug(teaTypes); } }
- [File (ファイル)] | [Save (保存)] をクリックします。
コードを実行する
-
Tea.orderTea();
コードを実行します。 - デバッグログを確認します。
デバッグログに、対応付けには
Black=Earthy
、Herbal=Sweet
、White=Sweet
という 3 つのキーと値のペアがあることが示されます。
Earthy (自然な風味) と Sweet (甘美な風味) という値は、フレーバープロファイルです。対応付けでは値の重複が認められるため、Sweet (甘美な風味) が 2 種類のお茶のフレーバープロファイルになっています。
get メソッド
対応付けの値にアクセスするには、次のとおり get
メソッドを使用します。
既存のキーが提供されている場合は、get
メソッドでそのキーの値が返されます。提供されたキーが値に対応付けられていない場合は、get
メソッドで null が返されます。前述のとおり、対応付け宣言で、戻り値に求めるデータ型を指定します。値を返す変数は、対応付け宣言で指定するデータ型と同じである必要があります。
対応付けから値を取得する
- Tea クラスで、orderTea メソッド (2 ~ 8 行目) を次のコードに置き換えます。
public static String orderTea(){ Map <String, String> teaTypes = new Map <String, String>(); teaTypes.put('Black', 'Earthy'); teaTypes.put('White', 'Sweet'); teaTypes.put('Herbal', 'Sweet'); String flavorProfile = teaTypes.get('Herbal'); System.debug('The flavorProfile of Herbal is: ' + flavorProfile); return flavorProfile; }
- [File (ファイル)] | [Save (保存)] をクリックします。
コードを実行する
-
Tea.orderTea();
コードを実行します。 - デバッグログを確認します。
teaTypes
対応付けを文字列値で宣言するため、戻り値のデータ型も文字列でなければなりません (flavorProfile
)。
これで、Apex の 3 種のコレクションをすべて習得しました。
コレクション種別 |
説明 |
リスト |
同じデータ型の順序付けられた項目の集合体。各項目に、リスト内の位置を表すインデックス番号が付けられます。 |
セット |
同じデータ型の一意の項目の集合体で、順序はありません。 |
対応付け |
キー - 値ペアのコレクション。一意のキーがそれぞれ 1 つの値に対応付けられます。 |
上級モジュールで、組織内のデータのクエリに取り組みます。データを受信したら、情報を保存する場所が必要になりますが、コレクションは一時的なストレージとして役立ちます。コレクションについての詳細は、「リソース」セクションの『Apex 開発者ガイド』へのリンクを参照してください。
リソース
- Apex 開発者ガイド: Apex の Set のメソッド
- Apex 開発者ガイド: Apex の対応付け
- Apex 開発者ガイド: Apex の Map のメソッド