簡體   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