如何在迭代地图时减去单个散列图中的值

时间:2016-11-27 11:56:20

标签: java hashmap

我有一个散列图,其中包含每个月B个人的食物需求,如下所示:

Map<String,Float> profileMap = new LinkedHashMap<String,Float>();

map.put("B_JAN",8);
map.put("B_FEB",10);
map.put("B_MAR",8);
// ...

等到DEC

我需要创建一个新地图,显示每个月的消费量。通过从上个月的值中减去当前月份值来计算消耗量。所以我的结果应该是这样的:

{&#34; B_JAN&#34;:8,&#34; B_FEB&#34;:2,&#34; B_MAR&#34;: - 2}依此类推。

如何在迭代地图时进行此计算?

2 个答案:

答案 0 :(得分:1)

LinkedHashMap优于简单HashMap的主要特征是,当您对其进行迭代时,它会维护键的插入顺序。 由于您使用的是LinkedHashMap,因此问题的解决方案非常简单:

Map<String,Integer> profileMap = new LinkedHashMap<>();

profileMap.put("B_JAN",8);
profileMap.put("B_FEB",10);
profileMap.put("B_MAR",8);

int prev = 0;
Map<String, Integer> result = new LinkedHashMap<>();
for(Map.Entry<String, Integer> e : profileMap.entrySet()) {
    result.put(e.getKey(), e.getValue() - prev);
    prev = e.getValue();
}

for(Map.Entry<String, Integer> e : result.entrySet()) {
    System.out.println(e.getKey()+ ": " +e.getValue());
}

,输出正如预期的那样:

B_JAN: 8
B_FEB: 2
B_MAR: -2

PS:请注意,如果您不再需要按键顺序,生成的地图也可以是其他类型(例如HashMap)。它还可以替换profileMap地图中的值,如果你不再这样做了。

答案 1 :(得分:0)

地图不会保持您的键的顺序与Set不保持其值的顺序相同。有一个类SortedMap,但它不按照添加的顺序保持键的顺序,它按值对它们进行排序。所以你需要做的就是保持你的钥匙&#34; B_JAN&#34;,&#34; B_FEB&#34;按照您希望的顺序列表中的等等,然后您需要遍历列表并根据列表从地图中提取和更改值。它看起来像这样:

for(int i = 11; i > 0; i--) {
  myMap.put(myList.get(i), myMap.get(myList.get(i)) - myMap.get(myList.get(i-1));
}