键值对的排序
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
示例:-
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()
契约。
解决方案:-
我们知道HashCode
是用来存储在Bucket
中的。假设 hashcode
作为 2-D matrix
中的行号,并且每一行都有 entry[key,value]
.
的链表
实现 hashcode()
这样对于每个 entry[key,value]
你会得到不同的`桶号(行号)。
执行equals()
方法检查每个桶的条目[key,value].
是否相等
复杂度:- 如果将每个 entry[key, value]
分配给不同的存储桶,那么 SEARCHING
和 ADDING
复杂度将为 o(1) .
请参考以下文档以更好地理解解决方案:-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。
我有以下两个类:
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
示例:-
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()
契约。
解决方案:-
我们知道
HashCode
是用来存储在Bucket
中的。假设hashcode
作为2-D matrix
中的行号,并且每一行都有entry[key,value]
. 的链表
实现
hashcode()
这样对于每个entry[key,value]
你会得到不同的`桶号(行号)。执行
equals()
方法检查每个桶的条目[key,value]. 是否相等
复杂度:- 如果将每个
entry[key, value]
分配给不同的存储桶,那么SEARCHING
和ADDING
复杂度将为 o(1) .请参考以下文档以更好地理解解决方案:-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。