問題
次のコードの実行時間を短縮するために、開発者が取るべき行動はどれですか。
List<Account> allAccounts = [SELECT Id FROM Account];
List<Contact> allContacts = [SELECT Id, AccountId FROM Contact];
for (Account a : allAccounts) {
for (Contact c : allContacts) {
if (c.AccountId == a.Id) {
// do work
}
}
}
- 取引先責任者のSOQLにGROUP BYオプションを追加する
- allaccountsに対してMap<Id,Account>を使用する
- SOQL用のApexヘルパークラスを作成する
- Contactループの中にAccountループを入れる
正解
- 取引先責任者のSOQLにGROUP BYオプションを追加する
- allaccountsに対してMap<Id,Account>を使用する
- SOQL用のApexヘルパークラスを作成する
- Contactループの中にAccountループを入れる
解説
それぞれの選択肢の理由について説明します。
□ 取引先責任者のSOQLにGROUP BYオプションを追加する
これは不正解です。このコードの問題は、ネストされたループの中での比較にあります。GROUP BYオプションを追加することは、この問題を解決するものではありません。
□ allaccountsに対してMap<Id,Account>を使用する
これは正解です。Map<Id, Account>
を使用することで、各Contact
のAccountId
をキーとして関連するAccount
を効率的に検索できます。これにより、ネストされたループを使用する必要がなくなり、実行時間が大幅に短縮されます。
□ SOQL用のApexヘルパークラスを作成する
これは不正解です。ヘルパークラスの作成は、コードの整理や再利用を容易にするためのものであり、実行時間の短縮には直接的には寄与しません。
□ Contactループの中にAccountループを入れる
これは不正解です。ループの順序を変更するだけでは、実行時間の問題は解決されません。ネストされたループの問題は、ループの順序に関係なく発生します。
以下が、Map<Id, Account>
を使用してコードを改善した例です。
List<Account> allAccounts = [SELECT Id FROM Account];
List<Contact> allContacts = [SELECT Id, AccountId FROM Contact];
// AccountのIdをキーとして、それに関連するAccountを値とするマップを作成
Map<Id, Account> accountMap = new Map<Id, Account>(allAccounts);
for(Contact con : allContacts){
if(accountMap.containsKey(con.AccountId)) {
// do work
}
}
この改善されたコードでは、allContacts
の各Contact
に対して、関連するAccount
がaccountMap
に存在するかどうかを効率的に確認しています。ネストされたループを使用する必要がなくなったため、実行時間が大幅に短縮されます。
次の問題へ
【Salesforce 認定Platformデベロッパー】試験対策:第173問
問題 開発者は、AccountレコードまたはContactレコードを処理できるApexメソッドが必要です。開発者はどのメソッドを使用する必要がありますか。 Public void doWork(Ac…
前の問題へ
【Salesforce 認定Platformデベロッパー】試験対策:第171問
問題 AccountListという名前のList<Account>コレクション内の各Accountを反復処理するための有効な選択肢はどれですか。2つ選びなさい。 for (Integer i=0; i <…
1問目から復習する
【Salesforce 認定Platformデベロッパー】試験対策:第1問
問題 デバッグログに書き込まれるときのxの値は何ですか。 Integer x = 0; do { x = 1; x++; } while (x < 1); System.debug(x); 0 1 2 3 正解 0 1 2 3 解説 デバッ…
コメント