Как добавить несколько объектов одного типа с одним и тем же ключом в HashMap - PullRequest
0 голосов
/ 13 сентября 2011

Привет, я думаю, что это очень простая проблема, но я не могу пройти через это сейчас;Существует два вида объектов: RuleObject,TaskObject Ниже приведены определения RuleObject,TaskObject

RuleObject
  ruleID,RulePatternType,RulePrint

TaskObject
  taskID,taskName,Org,ruleID

ruleArrayList - это все объекты RuleObjects

taskArrayList - это все объекты TaskObjects

Финальным формированием будет выборка всех RuleObjects, используемых TaskObjects и упорядочение по RuleObjects, как показано в примере ниже:


RuleObject.RulePatternType1

 TaskName1  TaskOrg1    RUleObject.rulePrint1
 TaskName2  TaskOrg2    RuleObject.rulePrint1

RuleObject.RulePatternType2

 TaskName3  TaskOrg1    RUleObject.rulePrint2
 TaskName4  TaskOrg2    RuleObject.rulePrint2
 TaskName5  TaskOrg3    RUleObject.rulePrint2
 TaskName6  TaskOrg4    RuleObject.rulePrint2

Фрагмент кода:

List<TaskObject> taskArrayList = compModIF.getRecurringTasksForOrgsAndEffDate(allOrgIds, effDate);        
        List<RuleObject> ruleArrayList = compModIF.getComplianceTaskRecurrenceRules();
        Map ruleTypes = new HashMap();
        Map groupTaskTypes = new HashMap();
        Map groupRecurRulesNames = new HashMap();
        Map masterMapOfallMaps = new HashMap();
        Map recurPrintMap = new HashMap();
        Map recurPatternTypeMap = new HashMap();
        List groupRecuringTaskTypesList = null;
        Map filterRules = new HashMap();
        List completedList = new ArrayList();
        for(Iterator iter = ruleArrayList .iterator(); iter.hasNext();)
        {
            RuleObject ruleBase = (RuleObject)iter.next();              
            ruleTypes.put(ruleBase.getRecurRuleID(),ruleBase);

        }

        if (recurringTaskList != null)
        {
            for (Iterator it = taskArrayList .iterator(); it.hasNext();)
            {               
                TaskObject aTaskDef = (TaskObject)it.next();
                groupRecuringTaskTypesList = new ArrayList();
                if(ruleTypes.containsKey(aTaskDef.getTaskRecurRuleIDAsLong()))
                {
                    RuleObject ruleBase = (RuleObject)ruleTypes.get(aTaskDef.getTaskRecurRuleIDAsLong());                   
                    groupRecuringTaskTypesList.add(aTaskDef);                   
                    groupTaskTypes.put(ruleBase.getRecurRuleID(),groupRecuringTaskTypesList);
                    groupRecurRulesNames.put(ruleBase.getRecurRuleID(), ruleBase.getRecurRuleName());
                    if(ruleBase.getRecurPatternType()==ComplianceCodes.TASK_RECUR_PATTERN_TYPE_DAILY)
                    {
                        completedList= getDailyRecursCommentsAsCompleted(ruleBase.printRule());
                        recurPrintMap.put(ruleBase.getRecurRuleID(), completedList);
                    }
                    //groupRecuringTaskTypes = new ArrayList();
                    recurPatternTypeMap.put(ruleBase.getRecurRuleID(), ruleBase.getRecurPatternType());

                }
            }
       }

Проблема в том, что для 1 правила ID существует несколько массивов, из-за которых я могу получить последний добавленный список.Кто-нибудь может предложить лучшую альтернативу для этого.

Ответы [ 3 ]

3 голосов
/ 13 сентября 2011

На самом деле я не очень внимательно следил за вашим примером, но, похоже, вам нужна мультикарта - отображение от одного ключа до нескольких значений.

Guava предоставляет интерфейс для этой и различных реализаций, доступ к которым обычно осуществляется через Multimaps.

2 голосов
/ 13 сентября 2011

Вы должны хранить коллекцию для каждого ключа:

Map<KeyType, Collection<ValueType>> map = 
                       new HashMap<KeyType, Collection<ValueType>>()
0 голосов
/ 13 сентября 2011

Вы можете достичь этого, просто используя Object в качестве значения. и определите карту, как показано ниже.

Map map = new HashMap()

Затем, когда вы устанавливаете обычный объект без кратного значения установить для ключа и значения в качестве любого valueObject map.put("key", valueObject)

если вы хотите добавить более одного, вы можете проверить наличие ключа map.containsKey("key"), а затем добавить его в массив и добавить оставшиеся значения в этот список map.put("key", valueObjectList).

Примечание : просто убедитесь, что при следующем извлечении его выполните проверку instanceof перед тем, как получить доступ к значению в виде объекта или списка.
Alternate soln : сохранить значение в виде списка объектов. проще кодировать.

...