2011-09-13 14 views
0

嗨,我認爲這是非常簡單的問題,但我現在無法完成; 有兩種Objects(對象)RuleObject,TaskObject 的下面是RuleObject,TaskObject如何在HashMap中添加多個具有相同密鑰的同一類型的對象

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 ruleID有由於多個的ArrayList我能夠獲取最後添加的列表。 任何人都可以提出更好的替代方案。

+3

如果您要避免對所有變量(規則類型等)使用原始類型,那麼您的代碼將更加清晰。 –

+1

如果可能,應該使用通用映射。如何獲得一個地圖,其關鍵是一個規則或規則ID,其值是任務列表清單。換句話說,一個'List <列表>' –

回答

3

我並沒有真的太緊跟你的例子,但它聽起來像你需要的是一個多圖 - 從單個鍵到多個值的映射。

Guava爲此和各種實現提供interface,通常通過Multimaps訪問。

+0

哇!這是免費使用的嗎?任何許可證信息都會有幫助 – GustyWind

+2

@GustlyWind:從第一個鏈接頁面:「代碼許可證:Apache許可證2.0」。 –

2

你必須存儲每個鍵的集合:

Map<KeyType, Collection<ValueType>> map = 
         new HashMap<KeyType, Collection<ValueType>>() 
0

你可以簡單地通過使用對象作爲價值實現它。並定義如下所示的Map。

Map map = new HashMap()

然後當u盤一個普通的對象沒有多個值 密鑰和值作爲任何的ValueObject map.put("key", valueObject)

當你想添加多個

,您可以檢查組退出密鑰map.containsKey("key"),然後將其添加到數組列表中,並將其餘值添加到此列表中map.put("key", valueObjectList)

注意:只要確保下次您再檢查一次,請在將值作爲對象或列表訪問之前執行instanceof檢查。
備用溶液:將值存儲爲對象列表。編碼更簡單。

相關問題