Dedulicate List of Opportunitites

Искал решение для способа дедубликации записей в листе с opportunity.
Условия такие: Есть лист с Opportunity, у каждой из них есть тип сервиса например
Car, Ship, Plain.
И существует Close Date на каждом. Так вот если у них совпадают типы сервиса, то остаться должен тот у кого дата ближе к текущей.
Получилось написать такого вот монстра.

        for(Integer i = 0; i < opportunities.size(); i++) {
            Opportunity oppI = opportunities.get(i);
            for(Integer j = 0; j < opportunities.size(); j++) {
                Opportunity oppJ = opportunities.get(j); 
                if(oppI.Service__c.equals(oppJ.Service__c) && i != j) {
                    if(oppI.CloseDate > oppJ.CloseDate) {
                        opportunities.remove(j); 
                    }  
                    if(oppI.CloseDate < oppJ.CloseDate) {
                        opportunities.remove(i); 
                    }
                }
            }
        } 

Какие есть идеи для наиболее єффективного способа дедублицирования?

1 Вподобання

А если использовать паттерны для этого? возможно слегка подпарвить под свои нужды.
например можно попоробовать заюзать chain of responsibility.
Или взять готовый вариант с Filter Pattern. пробовали использовать?

я б через мапу це зробив би, щось типу такого:

    public static List<Opportunity> filterOpportunitiesByServiceType(List<Opportunity> opps) {
        Map<String, Opportunity> serviceToOpportunity = new Map<String, Opportunity>();

        for (Opportunity opp : opps) {
            if (serviceToOpportunity.containsKey(opp.Service__c)) {
                Opportunity oppInMap = serviceToOpportunity.get(opp.Service__c);
                if (opp.CloseDate < oppInMap.CloseDate) {
                    continue;
                }
            } 
                
            serviceToOpportunity.put(opp.Service__c, opp);
        }

        return serviceToOpportunity.values();
    }

Бігати for циклом для кожного верхнього рівня n раз, це дуже дорого!

3 Вподобання

Не хочетелось бы для просто дедубликации в каком-то дном случае, писать целые паттерны. Но если он довольно прост то почемубы и нет, есть какие-нибудь для примера?

Спасибо, этот вариант оказался рабочим, и дешевле в плане ресурсов.

:grin: будь ласка!