有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java如何在HashMap中添加多个具有相同键的相同类型的对象

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

RuleObject
  ruleID,RulePatternType,RulePrint

TaskObject
  taskID,taskName,Org,ruleID

ruleArrayListRuleObjects的所有对象

taskArrayListTaskObjects的所有对象

最终的形式是获取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. # 1 楼答案

    你可以通过简单地使用对象作为值来实现它。并定义地图,如下所示

    Map map = new HashMap()

    然后当你设置一个普通对象而没有多个值时 将键和值设置为任意valueObject map.put("key", valueObject)

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

    注意:只需确保下次检索时,在以对象或列表的形式访问该值之前进行instanceof检查即可
    Alternate soln:将值存储为对象列表。编写代码更简单

  2. # 2 楼答案

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

    Map<KeyType, Collection<ValueType>> map = 
                           new HashMap<KeyType, Collection<ValueType>>()
    
  3. # 3 楼答案

    我并没有太仔细地学习你的例子,但听起来你需要的是一个多重映射——一个从一个键到多个值的映射

    Guava为这个和各种实现提供了一个interface,通常通过^{}访问