繁体   English   中英

Hashmap 相同值不同键比较

[英]Hashmap same values different key comparison

我的 HashMap 类型包含

    String storeId = "3501";
    HashMap<String,String> hMap =  new HashMap<>();
    hMap.put("01",105);
    hMap.put("02",3501);
    hMap.put("07",3501);

    for (int mainLoop=0; mainLoop < 3 ;mainLoop++){
    for (Map.Entry<String, String> map : hMap.entrySet()) {
                    if (storeId.equalsIgnoreCase(map.getValue())) {
                        fulFillmentType = map.getKey();
                    }
                }
    }

每次执行 mainLopp 时。 当它第一次点击“3501”时,应该只返回“02”,而在第三次循环中点击“3501”应该返回“07”。 目前输出只有“07”

我建议问题在于您没有跟踪所有匹配键的状态。 如果要跟踪所有匹配的键,请考虑使用字符串集合:

String storeId = "3501";
HashMap<String,String> hMap =  new HashMap<>();
hMap.put("01", "105");
hMap.put("02", "3501");
hMap.put("07", "3501");

List<String> matches = new ArrayList<>();

for (int mainLoop=0; mainLoop < 3 ;mainLoop++) {
    for (Map.Entry<String, String> map : hMap.entrySet()) {
        if (storeId.equalsIgnoreCase(map.getValue())) {
            matches.add(map.getKey());
        }
    }
}

matches.forEach(System.out::println);

请注意,在您的原始问题中, hMap的值是整数文字,而不是字符串。 它们需要是用双引号括起来的字符串,以便您的代码甚至可以编译。

你说

“02”应该回归
第三个循环应该返回“07”

但实际上你永远不会“返回”也不会打破任何循环。 因此,第一次找到 3501 时,将“02”分配给fulFillmentType ,第二次将其替换为“07”。
所以在你所有的迭代之后: fulFillmentType == "07"

现在,您必须知道HashMap及其entrySet在您阅读其内容时不保证任何排序顺序。 因此,最后读取的值可能随机为“02”或“07”

因为你的这段代码:

hMap.put("02",3501);

hMap.put("07",3501);

如果它们同时操作,它们将发生冲突 它们发送的结果为 02 或 07,但它们的条件与其他条件不同

您给定的值与键匹配 - 02 & 07

所以我认为我们不需要制作列表或任何东西,我认为使用相同的值进行密钥压缩是一个非常简单的逻辑。

    String storeId = "3501";
    HashMap<String, String> hMap = new HashMap<>();
    hMap.put("01", "105");
    hMap.put("02", "3501");
    hMap.put("07", "3501");

    for (Map.Entry<String, String> map : hMap.entrySet()) {
        if (storeId.equalsIgnoreCase(map.getValue())) {
            System.out.println("Match Found with Key " + map.getKey());
        }
    }

要从第一次匹配中获得结果,您必须break; 循环。 如果您想获得具有相同值的键,您需要将结果重新存储到new ArrayList<String>() 使用 Java 8:

List<String> result = map.entrySet().stream().filter(entry -> "someString".equals(entry.getValue())).map(
            Map.Entry::getValue).collect(Collectors.toList());

暂无
暂无

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

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