2017-03-23 70 views
0

嗨這麼一個奇怪的問題...(其價值的最的) 讓我們先從代碼的簡單描述: 我充滿<PlayerUUID, KingdomUUID> 一個HashMap凡playerUUID處於關鍵hashmap(顯然)Java的HashMap中獲取價值

現在對於我的捕獲進程系統,我需要確定有多少不同的值,因此哪些是最多的。

例如: 3名選手在進攻點,其中2名選手在厄裏翁王國,1名在埃里昂。 我需要檢查hashmap的值來查看哪個王國擁有最多的攻擊者。 (ORION是答案)

問候, 托馬斯

我希望這個描述是不夠好,如果不是問了!

+1

你有沒有嘗試任何事情了嗎? – f1sh

+1

製作一個新的HashMap ,循環遍歷映射中的所有Map.Entry ,並對新散列表中的一個做一個自動增量。最後,您可以遍歷該散列表並獲取最大值。 – Wietlol

+0

我正在嘗試這個atm,但是我的大腦正在崩潰,我得到了第一個2部分,但最終我無法經理從新的hashmap中獲得最高價值的鍵,我無法找到如何找到最高值的簡單解決方案,從而獲得了最重要的解決方案:S – KingConquest

回答

0

使用此方法:

Entry<KingdomUUID, Integer> getMax(Map<PlayerUUID, KingdomUUID> input) { 
    Map<KingdomUUID, Integer> r = new HashMap<>(); 
    for(KingdomUUID kingdom:input.values()){ 
    final Integer old = r.get(kingdom); 
    r.put(kingdom, old==null?1:old+1); 
    } 
    Map.Entry<KingdomUUID, Integer> max = null; 
    for(Map.Entry<KingdomUUID, Integer> e:r.entrySet()){ 
    if(max==null || e.getValue()>max.getValue()){ 
     max = e; 
    } 
    } 
    return max; 
} 

可以返回的對象上使用getKey(),看看哪個KingdomUUID最頻繁,並出現getValue()多少次。

1

你可以做f1sh做的。但是,Java 8添加了流和lambdas,您也可以使用它。由此產生的代碼更緊湊,更具可讀性,且不易出錯。這段代碼會稍微慢一些,但是除非處理很多值,否則你甚至不會感覺到它。

public KingdomUUID getMax(HashMap<PlayerUUID, KingdomUUID> inputMap) { 
    return inputMap.entrySet() 
     .stream() 
     .max((entry1, entry2) -> entry1.getValue() > entry2.getValue() ? 1 : -1) 
     .get() 
     .getValue(); 
} 

更多Java 8 streams.

更多Java 8 lambdas.

+0

我想讓它說PlayerUUID和KingdomUUID實際上不是對象,而是UUID對象的名稱:) 這個stilll的工作原理是否相同? – KingConquest

+0

@KingConquest你的意思是這些值是字符串?當然會。它將與任何類型的鍵和值一起工作。但是,我不確定爲什麼要將字符串保存起來,而不是將實際的對象保存到Map中? – leonz

+0

*我需要檢查hashmap的值來查看哪個王國攻擊者的數量最多*但是這個回答只是返回最高值的KingdomUUID? –