java 如何使用Map.merge来增加计数器的值?

mfpqipee  于 10个月前  发布在  Java
关注(0)|答案(2)|浏览(62)

我正试图通过实现Map.merge()来重构一个在HashMap中以更有效的方式计算键的方法。如何在下面的代码中实现:

public Map<Character, Integer> countCharacterUsage(String input) {
    Map<Character, Integer> characterToCountUsage = new WeakHashMap<>();
    for (char symbol : input.toCharArray()) {
        if (characterToCountUsage.containsKey(symbol)) {
            int symbolsCount = characterToCountUsage.get(symbol);
            characterToCountUsage.put(symbol, ++symbolsCount);
        } else {
            characterToCountUsage.put(symbol, 1);
        }
    }

    return characterToCountUsage;
}

字符串

kqlmhetl

kqlmhetl1#

你可以使用计算

characterToCountUsage.compute(symbol, (k,v)-> v==null ? 1 : v+1);

字符串
与merge

characterToCountUsage.merge(symbol,1, (k,v)-> v+1);

zzoitvuj

zzoitvuj2#

根据merge()行为:

V oldValue = map.get(key);
 V newValue = (oldValue == null) ? value :
          remappingFunction.apply(oldValue, value);
 if (newValue == null)
   map.remove(key);
 else
   map.put(key, newValue);

字符串
正确的做法是

characterToCountUsage.merge(symbol, 1, (oldValue, value) -> oldValue + 1);


但如果你想压缩它甚至更多,这里是一个班轮:

Map<Character, Integer> characterToCountUsage = input.chars().mapToObj(c -> (char) c).collect(Collectors.toMap(Function.identity(), newKey -> 1, (value1, value2) -> value1 + value2));

相关问题