如何将java String转换为map?

时间:2015-04-24 01:46:27

标签: java hashmap

我想将以下格式文件转换为map" key,value"对变量。 我怎么能这样做?

猫10 母鸡10 猫10 枪10 母鸡10 狮子10 猫头鹰10 猪10

1 个答案:

答案 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块中。