java如何在HashMap中添加多个具有相同键的相同类型的对象
嗨,我认为这是一个非常简单的问题,但我现在无法解决它;
有两种对象-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个ruleID,有多个ArrayList,因此我能够获得最后添加的列表。 有谁能提出更好的替代方案吗
# 1 楼答案
你可以通过简单地使用对象作为值来实现它。并定义地图,如下所示
Map map = new HashMap()
然后当你设置一个普通对象而没有多个值时 将键和值设置为任意valueObject
map.put("key", valueObject)
当您想添加多个时,可以检查退出键
map.containsKey("key")
,然后将其添加到arraylist,并将剩余值添加到此列表map.put("key", valueObjectList)
注意:只需确保下次检索时,在以对象或列表的形式访问该值之前进行
instanceof
检查即可Alternate soln:将值存储为对象列表。编写代码更简单
# 2 楼答案
您必须为每个密钥存储一个集合:
# 3 楼答案
我并没有太仔细地学习你的例子,但听起来你需要的是一个多重映射——一个从一个键到多个值的映射
Guava为这个和各种实现提供了一个interface,通常通过^{} 访问