如何在java中比较两种不同的hashmap

dxpyg8gm  于 2021-07-08  发布在  Java
关注(0)|答案(1)|浏览(398)

我有两个字符串转换成hashmaps,第一个是用户给应用程序的输入。第二个是包含大量单词的数组。
我需要比较两个hashmap来检查输入是否可以重新组织以匹配数组中的一个字。不需要使用用户输入到系统的每个字符,第一个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;
}

在我的数组中有一个单词“stop”,它将以这种方式填充countduplicatemaparray:

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

ndasle7k1#

要理解您的需求有点困难,但我认为您需要一个测试来检查第二个Map中的所有键在第一个Map中的值是否大于或等于第二个Map的值。
如果正确的话:

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

还请注意,您可以使用 merge 要简化创建Map的代码:

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

或者更好的方法是直接从输入创建Map:

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

它使用 Integer 而不是 Character 表示字符(通过对字符进行零扩展),但是如果您只是在 predicate 中使用它们,那么这对您来说没有任何区别。

相关问题