2012-03-01 9 views
1

地図内のマップをone of my Triggersにする必要があります。私はそれが文書化されているとして、最初にマップを構築する方法を知っている:Apexマップ内のマップ

Map<Id, Map<Id, Addendum__c>> addendums = new Map<Id, Map<Id, Addendum__c>>{};

しかし、私は実際に多次元マップに値を割り当てるトラブルを抱えています。通常は、.put()を使用して値を1次元マップに配置します。たぶん私はまだその機能を使うはずですが、私の人生は正しい構文を理解できません。

addendums.put(addendum.Opportunity__c, addendum.Id, addendum);

addendums.put(addendum.Opportunity__c, (addendum.Id, addendum));

は、誰もがこれを行う方法を知っています:

は、私は動作しません、以下を試してみましたか?

ありがとうございます!

答えて

3

サンプルコードを使用すると、2番目のレベルのマップは1つのエントリしか持てませんが、それ以上必要な場合は、下のコードがあなたのトリックを行います:

// This line creates the map in the proper format 
Map<Id,Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>{}; 

// This for loop goes through each addendum and first places it into a single dimension map. 
// Once that map is created, it is placed into the final multi-dimensional 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]) 
{ 
    if(addendums.get(addendum.Opportunity__c) == null) 
    { 
     addendums.put(addendum.Opportunity__c, new Map<Id, Addendum__c>{addendum.Id => addendum); 
    } 
    else 
    { 
     addendums.get(addendum.Opportunity__c).put(addendum.Id, addendum); 
    } 
} 

ご覧のとおり、最初のマップでget()を使用して、2番目のレベルの適切なマップを取得して補題を追加します。

0

私はそれが最も効率的な方法であるかどうかはわかりませんが、これを行う方法が見つかりました。だから、あなたがより良い解決策を持っているなら、私に知らせてください、私はあなたに "解決策"の信用を転送します。

私が行ったことは、最初のマップを割り当ててから、最後のマップにそのマップを配置することでした。

// This line creates the map in the proper format 
Map<Id,Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>{}; 

// This for loop goes through each addendum and first places it into a single dimension map. 
// Once that map is created, it is placed into the final multi-dimensional 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]){ 
    Map<Id,Addendum__c> thisAddendum = new Map<Id,Addendum__c>{ addendum.Id => addendum }; 
    addendums.put(addendum.Opportunity__c,thisAddendum); 
} 
1

ジョシュが提供した方法は問題ありません。 1行のコードを削除するには、次の方法を使用できます。

Map<Id, Map<Id,Addendum__c>> addendums = new Map<Id,Map<Id,Addendum__c>>(); 
for(Addendum__c addendum : [SELECT Id,Opportunity__c FROM Addendum__c WHERE Opportunity__c IN :oppBatch]){ 
    addendums.put(addendum.opportunity__c, new Map<Id, Addendum__c>{addendum.id => addendum}); 
} 

私はこのアプローチよりも効率的なアプローチを知らない。

+0

応答のおかげで、私はそれが壊れたままにして、必然的に1年後に戻ってくる必要があるときに読みやすくすると思います。 – VictorKilo

関連する問題