首页 > 解决方案 > 如何在 Java 中使用合并方法将元素附加到地图中的列表值>?

问题描述

我试图理解合并方法。我有一张地图<Character, List<Integer>>。我想将索引添加到相应键的列表中。我想使用合并方法来做到这一点。我尝试了以下方法。我越来越UnsupportedOperationException。使用该方法的最佳方法是什么merge

Map<Character, List<Integer>> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
    int t = i;
    map.merge(s.charAt(i), Arrays.asList(t), (c, list) -> {
        map.get(s.charAt(t)).add(t);
        return c;
    });
}

标签: javacollections

解决方案


换成允许其调整大小Arrays.asList(t)。只是一个固定大小的包装器,不支持添加元素。new ArrayList<>(...)Arrays.asList

Map<Character, List<Integer>> map = new HashMap<>();
for (int i = 0; i < s.length(); i++) {
    int t = i;
    map.merge(s.charAt(i), new ArrayList<Integer>(Arrays.asList(t)), (c, list) -> {
        map.get(s.charAt(t)).add(t);
        return c;
    });
}

请注意,正如另一个答案所说,merge可以替换为computeIfAbsent.

如果您喜欢流,则可以使用可变归约:

Map<Character, List<Integer>> resultMap = IntStream
    .range(0, s.length())
    .collect(
        HashMap::new,
        (map, i) -> map.computeIfAbsent(s.charAt(i), ch -> new ArrayList<>()).add(i),
        HashMap::putAll
    );

推荐阅读