订购键值对

时间:2017-07-07 12:31:54

标签: java collections guava

我有以下两个类:

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或任何其他图书馆处理此类案件?

3 个答案:

答案 0 :(得分:5)

你说guava或任何其他库,这对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 :(得分:1)

我建议您执行以下操作:

将您的com.google.common.collect.Ordering<ValueClass>更改为com.google.common.collect.Ordering<Map.Entry<KeyClass, ValueClass>>,然后修改用于Comparator<ValueClass>的多个Map.Entry#getValue

因此,最大ValueClass将等于最大Map.Entry<KeyClass, ValueClass>

  

我可以使用此排序轻松找出最大值,但我感兴趣的是最大值的关键。

现在,您只需使用Map.Entry#getKey来获取最大值/条目的键。

答案 2 :(得分:1)

是肯定的。 使用Bidi地图: - Bidi Map

Download jar

How to use.

实施例: -

 let m = matrix_linear_combination(alpha, v1, 1-alpha, v0)

使用相同的方法,您只需要实现Map的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()合约。 解决方案: -

  1. 我们知道equals()用于存储在HashCode中。假设Buckethashcode中的行号,并且每行的链接列表为2-D matrix

  2. 实现entry[key,value],这样每个hashcode()你就会得到不同的“桶号”(行号)。

  3. 实施entry[key,value]方法检查每个桶的条目[键,值]中的相等性。

  4. 复杂性: - 如果您将每个equals()分配到不同的存储分区,则entry[key, value]SEARCHING复杂度将为 o(1)。< / p>

  5. 请参阅以下文档以更好地了解解决方案: - doc1 doc2