【问题标题】:Ordering for key value pairs键值对的排序
【发布时间】:2017-12-11 18:09:33
【问题描述】:

我有以下两个类:

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

【问题讨论】:

标签: java collections guava


【解决方案1】:

您说的是 guava 或任何其他库,这对于 Java 8 流来说很简单。如果你的Ordering<ValueClass> 实例被称为ordering

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

orElse 之前添加.map(Entry::getKey) 以获取密钥。

以上是可能的,因为番石榴的Ordering 实现了java.util.Comparator,所以你可以将它作为参数传递给comparing

【讨论】:

    【解决方案2】:

    我建议您执行以下操作:

    把你的com.google.common.collect.Ordering&lt;ValueClass&gt;改成com.google.common.collect.Ordering&lt;Map.Entry&lt;KeyClass, ValueClass&gt;&gt;,修改之前使用的多个Comparator&lt;ValueClass&gt;改用Map.Entry#getValue

    因此,最大 ValueClass 将等于最大 Map.Entry&lt;KeyClass, ValueClass&gt;

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

    现在,您可以简单地使用Map.Entry#getKey 来获取最大值/条目的键。

    【讨论】:

      【解决方案3】:

      是的。 使用比迪地图:- 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" );
      

      使用相同的方法,您只需要实现 Map 的 hascode()equals() 合约。 解决方案:-

      1. 我们知道HashCode用于存储Bucket。假设hashcode2-D matrix中的行号,每一行都有entry[key,value]的链表。

      2. 实现hashcode(),这样对于每个entry[key,value],您将获得不同的`bucket no(row no)。

      3. 实现equals()方法来检查每个桶的entry[key,value]是否相等。

      4. 复杂度:- 如果您将每个 entry[key, value] 分配到不同的存储桶,那么 SEARCHINGADDING 复杂度将是 o(1)

      5. 请参考以下文档以更好地理解解决方案:-doc1doc2

      【讨论】:

        猜你喜欢
        • 2012-07-02
        • 2011-07-31
        • 1970-01-01
        • 2015-06-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-08-17
        相关资源
        最近更新 更多