2017-07-07 72 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