2017-07-07 74 views
5

我有以下兩類:訂購的鍵值對

class KeyClass { 
    private prop1; 
    private prop2; 

    hashcode() { 
    //implemented properly 
    } 

    equals() { 
    //implemented properly 
    } 
} 

class ValueClass { 
    private prop1; 
    private prop2; 

    hashcode() { 
    //implemented properly 
    } 

    equals() { 
    //implemented properly 
    } 
} 

我試圖找出從地圖,這些類的對象分別爲鍵和值對的最大對。我也有一個使用多個比較器的com.google.common.collect.Ordering<ValueClass>。我可以很容易地找出使用這個順序的最大值,但是我感興趣的是最大值的關鍵。我可以寫一個特定的實現,其中我可以跟蹤我的關鍵字與循環中的值,並使用排序來比較值(類似於尋找最大值的傳統方式),但我想知道如果我們已經有這種情況下由Guava或任何其他庫處理?

+0

https://stackoverflow.com/questions/109383/sort-a-mapkey-value-by-values-java – mishadoff

回答

5

你說的番石榴或任何其他庫,這就是簡單的與Java 8流。如果您Ordering<ValueClass>實例被稱爲ordering

Entry<KeyClass, ValueClass> maxEntry = map.entrySet().stream() 
     .max(Comparator.comparing(Entry::getValue, ordering)) 
     .orElse(null); 

添加.map(Entry::getKey)orElse之前得到公正的關鍵。

以上是可能的,因爲番石榴的Ordering執行java.util.Comparator所以你可以將它作爲參數傳遞給comparing

1

我建議你做到以下幾點:

更改com.google.common.collect.Ordering<ValueClass>com.google.common.collect.Ordering<Map.Entry<KeyClass, ValueClass>>和修改用於使用Map.Entry#getValue而不是多個Comparator<ValueClass>

因此,最大ValueClass將相當於最大Map.Entry<KeyClass, ValueClass>

我可以很容易地找到使用這種排序的最大值,但我感興趣的是最大值的關鍵。

現在,您可以簡單地使用Map.Entry#getKey來獲取最大值/條目的關鍵。

1

是的。 使用的雙向地圖: - Bidi Map

Download jar

How to use.

例子: -

BidiMap bidiMap = new DualHashBidiMap(); 
bidiMap.put("il", "Illinois"); 
bidiMap.put("az", "Arizona"); 
bidiMap.put("va", "Virginia"); 
// Retrieve the key with a value via the inverse map 
String vaAbbreviation = bidiMap.inverseBidiMap().get("Virginia"); 

// Retrieve the value from the key 
String illinoisName = bidiMap.get("il"); 

使用,你只需要實現一個地圖的hascode()equals()合同相同的方法。 解決方案: -

  1. 我們知道,HashCode用於在Bucket來存儲。假設hashcode作爲2-D matrix中的行號,並且每行都有鏈接列表entry[key,value]

  2. 執行hashcode(),因此對於每個entry[key,value],您將得到不同的「桶號(行號)」。

  3. 執行equals()方法來檢查每個桶的條目[鍵,值]中的相等性。

  4. 複雜性: - 如果分配各entry[key, value]不同的桶,然後SEARCHINGADDING複雜性將是O(1)

  5. 請參考下面的文檔爲更好地瞭解解決方案: - doc1doc2