我有一个散列图,其中包含每个月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}依此类推。
如何在迭代地图时进行此计算?
答案 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));
}