2016-11-03 94 views
0

我有以下的HashMap:如何总结HashMap <String,<String,Integer >>中的值?

HashMap<String, HashMap<String,Integer>> dataArray = new HashMap<>(); 

在节目中,我使用增强的循环迭代几次,将数据插入到HashMap中,基于某种关键的,如:

dataArray.get(primaryKey).put(length, totalCost) 

它产生以下输出:

{123-456-789={00:05:00=500, 00:01:06=220}, 999-090-090={00:08:01=900}} 

我使用一个公式来计算totalCost值,但是我有,以确保它在每个ITE设置为0配给的开始。

我的问题是,我想总结totalCostlength值为每个primaryKey。最终结果应该是这样的:

{123-456-789={00:06:06=720}, 999-090-090={00:08:01=900}} 

我该如何实现这个目标?我是否必须创建另一个HashMap,或者是否可以修改已经存在的HashMap?可能有一个循环?

编辑:忘了提,如果我尝试获得现有totalCost值与dataArray.get(primaryKey).get(totalCost),编译器会抱怨有可疑呼叫java.util.Map并返回null

+1

你是说像这样? [IDEONE](https://ideone.com/v4j6ki) – Andreas

+0

这绝对有帮助,谢谢! – ForInfinity

+0

@Andreas,如果你发布它作为答案,它可能被标记为答案。 – elfan

回答

0

为什么这么复杂?只要改变你的数据结构。 OOP是为了解决这个问题。只需将子表存储在一个对象中,并提供适当的方法/变量。至于将数据插入现有的Map:您如何区分作为标准值插入的结果和?此外,这很可能会导致并发修改,尽管有办法解决这个问题。

+0

我很遗憾无法改变数据结构,它必须是我描述的方式。我知道我可以使用对象来实现这个目标,但由于限制我无法以任何方式影响,所以我无法这样做。 – ForInfinity

+0

在这种情况下,您的最佳拍摄是用于存储结果的第二个“地图”。对于那个你至少可以使用'Pair'作为值类型。 – Paul

+0

难道不可能获得'length'和'totalCost'的现有值并简单地将它们和新的值相加,而不是用'put'插入新的值?我试过这样做,但由于某种原因,我无法获得已经存在的那些。 – ForInfinity

0

如果您想以下面的形式得到最终结果: {123-456-789 = {00:06:06 = 720},999-090-090 = {00:08:01 = 900}} 为什么不通过在地图中只保留一个键值对来改变你的循环:

Map.Entry<String,Integer> entry=dataArray.get(primaryKey).entrySet().iterator().next(); 
String key= entry.getKey(); 
dataArray.get(primaryKey).put(key + length, dataArray.get(primaryKey).get(key) + totalCost); 

我希望这有助于!

+0

编译器不让我得到内部映射的关键字,建议使用'Set key'来代替,但这也失败了。 – ForInfinity

+0

我的坏处。试试这个,它应该工作得很好。 –

相关问题