【Salesforce 認定Platformデベロッパー】試験対策:第172問

問題

次のコードの実行時間を短縮するために、開発者が取るべき行動はどれですか。

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>を使用することで、各ContactAccountIdをキーとして関連する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に対して、関連するAccountaccountMapに存在するかどうかを効率的に確認しています。ネストされたループを使用する必要がなくなったため、実行時間が大幅に短縮されます。

次の問題へ

前の問題へ

1問目から復習する

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

雇われのシステムエンジニアです。
普段は車載ECUのセキュリティー分野に従事しております。

コメント

コメントする

このサイトはreCAPTCHAによって保護されており、Googleの プライバシーポリシー利用規約が適用されます。

日本語が含まれない投稿は無視されますのでご注意ください。(スパム対策)

目次