【问题标题】:How to add more than one Objects of same type with same Key inside a HashMap如何在HashMap中添加多个具有相同键的相同类型的对象
【发布时间】:2011-09-13 12:17:53
【问题描述】:

您好,我认为这是一个非常简单的问题,但我现在无法解决; 有两种Objects-RuleObject,TaskObject 以下是RuleObject,TaskObject的定义

RuleObject
  ruleID,RulePatternType,RulePrint

TaskObject
  taskID,taskName,Org,ruleID

ruleArrayListRuleObjects的所有对象

taskArrayListTaskObjects的所有对象

最终的形式是获取TaskObjects使用的所有RuleObjects并由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

代码 sn-p:

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,有多个数组列表,因此我能够获得最后添加的列表。 任何人都可以为此提出更好的替代方案吗?

【问题讨论】:

  • 如果您避免对所有变量(ruleTypes 等)使用原始类型,您的代码会更清晰。
  • 尽可能使用通用地图。有一个映射,其键是规则或规则 ID,其值是任务列表列表。换句话说,List&lt;List&lt;TaskObject&gt;&gt;

标签: java hashmap iteration


【解决方案1】:

我并没有真正遵循您的示例,但听起来您需要的是多映射 - 从单个键到多个值的映射。

Guava为此和各种实现提供interface,通常通过Multimaps访问。

【讨论】:

  • 哇!这可以免费使用吗?任何许可信息都会有所帮助
  • @GustlyWind:从第一个链接页面:“代码许可证:Apache 许可证 2.0”。
【解决方案2】:

您必须为每个键存储一个集合:

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

【讨论】:

    【解决方案3】:

    您可以简单地通过使用 Object 作为值来实现它。并定义如下所示的地图。

    Map map = new HashMap()

    那么当你设置一个普通对象没有多个值 将键和值设置为任何 valueObject map.put("key", valueObject)

    当您想添加多个时,您可以检查退出键map.containsKey("key"),然后将其添加到数组列表中,并将剩余值添加到此列表中map.put("key", valueObjectList)

    注意:只要确保下次检索它时,在将值作为对象或列表访问之前,请先检查 instanceof
    替代解决方案 em>:将值存储为对象列表。编码更简单。

    【讨论】:

      猜你喜欢
      • 2016-01-18
      • 1970-01-01
      • 1970-01-01
      • 2014-08-18
      • 2019-03-17
      • 2011-08-27
      • 1970-01-01
      相关资源
      最近更新 更多