我想将以下格式文件转换为map" key,value"对变量。 我怎么能这样做?
猫10 母鸡10 猫10 枪10 母鸡10 狮子10 猫头鹰10 猪10答案 0 :(得分:4)
由于您要添加重复键的值,因此可以使用Map.merge()
。
来自docs:
如果指定的键尚未与值关联或与null关联,则将其与给定的非空值关联。否则,将相关值替换为给定重映射函数的结果,或者如果结果为null则删除。 组合键的多个映射值时,此方法可能有用。
例如:
public static void main(String... args) {
String seq = "cat 10 hen 10 cat 10 gun 10 hen 10 lion 10 owl 10 pig 10";
// [cat, 10, hen, 10, cat, 10, gun, 10, hen, 10, lion, 10, owl, 10, pig, 10]
String[] splitEntries = seq.split(" ");
Map<String, Integer> myMap = new HashMap<>();
for (int i = 0; i < splitEntries.length - 1; i += 2) {
// Iterate on splitEntries incrementing i by 2, so we can store the pairs:
// (0, 1), (2, 3), (4, 5), etc.
String key = splitEntries[i];
Integer value = Integer.valueOf(splitEntries[i + 1]);
// Pass Integer::sum so the previous value will be summed with the new one
// when trying to insert a repeated key
myMap.merge(key, value, Integer::sum);
}
System.out.println(myMap);
}
输出:
{hen=20, gun=10, owl=10, cat=20, lion=10, pig=10}
如果您不能使用Java 8,而不是调用myMap.merge()
,则可以检查是否已为给定的key
存储了值。如果没有,只需制作previousValue = 0
并将其加到新的value
。
Integer previousValue = myMap.get(key);
if (previousValue == null) {
previousValue = 0;
}
myMap.put(key, previousValue + value);
请注意,这不是线程安全的。例如,在您致电get()
之后但在致电put()
之前,另一个主题可以更新地图,从而导致存储错误的值。如果这是一个问题,您可以将此代码放在synchronized
块中。