【问题标题】:How to compare 2 different hashmap in Java如何在 Java 中比较 2 个不同的 hashmap
【发布时间】:2020-11-23 21:10:22
【问题描述】:

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

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

【问题讨论】:

  • 70% 的问题是毫无意义的,因为您如何 构建这两个地图根本不重要。现在给出问题末尾的 2 个示例 HashMap,您又要问什么?如果其中一个是另一个的超集,我相信?请编辑问题,删除不相关的内容,否则请澄清您需要确定的内容。
  • 我只是尝试将人们可能需要考虑的所有信息放在最佳解决方案上。我需要一个解决方案来实现我在第一个 HashMap 中拥有的任何值,它们需要包含第二个 HashMap 的值。如果第二个 HashMap 有一个键“a”,则值为 3;第一个 HashMap 至少需要一个键“a”,值 3(或更多)。
  • 所以我是对的?您只需要知道第一张地图是否是第二张地图的超集。
  • 是的,很抱歉,如果我不明白你所说的超集是什么意思,我对编程有点陌生,我不懂一些表达方式。
  • 不,严格来说它不是超集。这是因为匹配键的值需要大于或等于。对于严格的超集,值必须相等。

标签: java hashmap compare


【解决方案1】:

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

如果正确,那么:

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 来表示字符(通过零扩展字符)但它不应该对您有任何影响,因为您只是在谓词中使用它们。

【讨论】:

  • 这正是我想要的!谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-12-16
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多