Карта вершины на карте - PullRequest
1 голос
/ 01 марта 2012

Мне нужна карта на карте в одном из моих триггеров. Я знаю, как изначально построить карту, как это задокументировано:

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

Однако у меня возникли проблемы с присвоением значений многомерной карте. Обычно я бы использовал .put() для размещения значений в одномерной карте. Может быть, я все еще должен использовать эту функцию, но я не могу до конца понять правильный синтаксис.

Я пробовал следующее, которые не работают:

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

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

Кто-нибудь знает, как это сделать?

Спасибо!

Ответы [ 3 ]

3 голосов
/ 02 марта 2012

Использование вашего примера кода будет работать, хотя, конечно, на карте второго уровня может быть только одна запись, если вам нужно больше, чем код ниже:

// 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 голосов
/ 02 марта 2012

Метод, предоставленный Джошем, работает отлично. Если вы хотите удалить одну строку кода, вы можете использовать следующий подход:

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 голосов
/ 01 марта 2012

Я нашел способ сделать это, хотя я не уверен, является ли это наиболее эффективным методом или нет.Поэтому, если у вас есть лучшее решение, пожалуйста, дайте мне знать, я перешлю вам кредит «решения».

Я назначил первую карту, а затем поместил эту карту в окончательную карту.

// 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);
}
...