首页 > 解决方案 > 如何在 Java 中比较 2 个不同的 hashmap

问题描述

我有 2 个转换为 HashMaps 的字符串,第一个是用户提供给应用程序的输入。第二个是一个包含很多单词的数组。

我需要比较两个 HashMap 以检查输入是否可以重新组织以匹配 Array 的单词之一。无需使用用户输入到系统的每个字符,第一个 HashMap 中可能有一些剩余的字符,但我需要确保它们可以匹配数组中的一个单词(第二个 HashMap)。

下面是我创建第一个 HashMap 的方法:

String normalizedInputWord = normalizeString(inputWord);

Map<Character, Integer> countDuplicateMapInput = new HashMap<>();

char[] charInputArray = normalizedInputWord.toCharArray();

for (char c: charInputArray) {
    if (countDuplicateMapInput.containsKey(c)) {
        countDuplicateMapInput.put(c, countDuplicateMapInput.get(c) + 1);
    } else {
        countDuplicateMapInput.put(c, 1);
    }
}

这是第二个:

Map<Character, Integer> countDuplicateMapArray = new HashMap<>();

for (int i = 0; i < 1; i++) {
    // Calls a function to normalize each String of the wordArray Array
    String normalizedWordArray = normalizeString(wordArray[i]);

    char[] charWordArray = normalizedWordArray.toCharArray();

    for (char c : charWordArray) {
        if (countDuplicateMapArray.containsKey(c)) {
            countDuplicateMapArray.put(c, countDuplicateMapArray.get(c) + 1);
        } else {
            countDuplicateMapArray.put(c, 1);
        }
    }
}

如何比较这两种结构并获得对以下示例的“真实”响应?

示例:输入是“不可阻挡的”并且 countDuplicateMapInput 将具有:

{
key: "p", value: 2;
key: "a", value: 1;
key: "b", value: 1;
key: "s", value: 1;
key: "t", value: 1;
key: "u", value: 1;
key: "e", value: 1;
key: "l", value: 1;
key: "n", value: 1;
key: "o", value: 1;
}

我的 Array 中有一个单词“stop”,它将以这种方式填充 countDuplicateMapArray:

{
key: "p", value: 1;
key: "t", value: 1;
key: "s", value: 1;
key: "o", value: 1;
}

标签: javahashmapcompare

解决方案


有点难以理解您的要求,但我认为您需要一个测试来检查第二个映射中的所有键是否在第一个映射中的值大于或等于第二个映射的值。

如果这是正确的,那么:

countDuplicateMapArray.entrySet().stream()
     .allMatch(e -> countDuplicateMapInput.getOrDefault(e.getKey(), 0) >= e.getValue())

另请注意,您可以使用merge简化代码来创建地图:

countDuplicateMapInput.merge(c, 1, Integer::sum);

或者更好的是直接从输入创建地图:

Map<Integer,Long> characterCounts = normalizeString(inputWord).chars().boxed()
    .collect(Collectors.groupingBy(c -> c, Collectors.counting()));
    

这使用Integer而不是Character表示字符(通过零扩展字符),但它不应该对您有任何影响,因为您只是在谓词中使用它们。


推荐阅读