簡體   English   中英

在Java中使用Hashmap是否可以打印出數量相同的鍵?

[英]Using a Hashmap in Java is it possible to print out the amount of keys will a same value?

如果我有一個具有完全相同的值但具有不同鍵的Hashmap,則可以使這些鍵具有相同的值,並打印出共享此值的鍵的數量以及共享的值本身,並且可以動態地做到這一點而無需費勁在if語句中編碼值? 例,

HashMap<String, String> map = new HashMap<>();

map.put("Order1"  " pending " );
map.put("Order2"  " cancelled " );
map.put("Order3"  " pending " );
map.put("Order4"  " fulfilled " );

所需的輸出

pending 2
cancelled 1
fulfilled 1

您可以將值放入Set以獲得唯一性,然后使用Collections.frequency計數每個元素的出現次數:

Set<String> singles = new HashSet<>(map.values());

for(String element : singles) {
    System.out.println(element + ": " + Collections.frequency(map.values(), element));
}

不,HashMap不能立即提供此功能。

但是,您可以使用兩種不同的方法來實現目標:

A)如果不需要經常檢查每個州的訂單數量,只需遍歷map.values()並計算每個州的訂單數量

B)如果訂單數量很大,或者需要經常檢查狀態,則每次添加新訂單或更新其狀態時,請為新狀態增加一個計數器,為舊狀態減少該計數器。

另一個選擇是將每個值映射到一個數字。 這是使用流執行此操作的一種方法:

public static <K, V> Map<V, Long> foo(Map<K, V> map) {
    return map.entrySet().stream()
            .collect(Collectors.groupingBy(Map.Entry::getValue, Collectors.counting()));
}

然后,您可以像這樣打印出結果:

Map<String, String> map = ...;
foo(map).forEach((k, v) -> System.out.printf("%s %d%n", k, v));

您也可以對其進行修改,以了解哪些鍵被映射到相同的值。

public static <K, V> Map<V, List<K>> foo(Map<K, V> map) {
    return map.entrySet().stream().collect(Collectors.groupingBy(
            Map.Entry::getValue,
            Collectors.mapping(Map.Entry::getKey, Collectors.toList())
    ));
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM