键值对的排序

Ordering for key value pairs

我有以下两个类:

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>。我可以使用此顺序轻松找出最大值,但我感兴趣的是最大值的键。

我可以编写一个特定的实现,其中我可以跟踪我的键 w.r.t 循环中的值并使用排序来比较值(类似于查找最大值的传统方法)但是我想知道 Guava 或任何其他图书馆是否已经处理过此类案例?

我建议您执行以下操作:

将您的 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>

I can easily find out the max of values using this ordering, but what I am interested into is the key of the max value.

现在,您可以简单地使用Map.Entry#getKey来获取最大value/entry的密钥。

是的。 使用比迪地图:- 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. 的链表
  3. 实现 hashcode() 这样对于每个 entry[key,value] 你会得到不同的`桶号(行号)。

  4. 执行equals()方法检查每个桶的条目[key,value].

  5. 是否相等
  6. 复杂度:- 如果将每个 entry[key, value] 分配给不同的存储桶,那么 SEARCHINGADDING 复杂度将为 o(1) .

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

你说 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) 以获得密钥。

以上是可行的,因为 guava 的 Ordering 实现了 java.util.Comparator,因此您可以将其作为参数传递给 comparing