繁体   English   中英

从 map 中获取两个元素,它们的总和等于所需的数字

[英]Getting two elements from a map which their sum equals to a desired number

我正在尝试找到一种方法来从 map 中获取前两个元素,它们的值加起来就是我想要的总和。 我在想一个结合了 2 个地图的解决方案,其中第二个 map 的键是目标号码的提醒减去第一个 map 的条目的值。我迷路了,不确定我错过了什么。 我在这里错过了什么?

您面临的问题是 int 是值,而不是键。 所以pairOfItems.containsKey(remainder)不应该编译。 幸运的是,Map 也有containsValue()方法。 只要对最低性能没有要求,就应该可以解决您的问题。
...并且您不需要第二个 map。您可以直接询问items.containsValue(reminder)

我建议引入一个新的 Map remainderToItem ,遍历所有相关项目并将它们的提醒添加到 Map 作为键和项目键作为值

然后再次迭代relevantItems Map 以发现价格与其他一些提醒匹配还要检查remainderToItem.get(entry.getValue()).equals(entry.getKey())) (如果值为 50 提醒也是 50) , 这可以防止再次将相同的项目添加到itemsThatCanBeBought

private static List<String> getTwoItemsWhichSumTo100(Map<String, Integer> items, int target) {

    Map<String, Integer> relevantItems = getRelevantItems(items, target);
    Map<Integer, String> remainderToItem = new HashMap<>();
    List<String> itemsThatCanBeBought = new ArrayList<>();

    for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {
        int remainder = target - entry.getValue();
        remainderToItem.put(remainder, entry.getKey());
    }

    for (Map.Entry<String, Integer> entry : relevantItems.entrySet()) {

        if (remainderToItem.containsKey(entry.getValue()) && !remainderToItem.get(entry.getValue()).equals(entry.getKey())) {
            itemsThatCanBeBought.add(entry.getKey());
            itemsThatCanBeBought.add(remainderToItem.get(entry.getValue()));
            return itemsThatCanBeBought;
        }
    }
    return itemsThatCanBeBought;
}

private static Map<String, Integer> getRelevantItems(Map<String, Integer> items, int target) {
    Map<String, Integer> relevantItems = new HashMap<>();
    for (Map.Entry<String, Integer> entry : items.entrySet()) {
        if (entry.getValue() < target) relevantItems.put(entry.getKey(), entry.getValue());
    }
    return relevantItems;
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM