我有以下两个类:
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 :(得分: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
实施例: -
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()
合约。
解决方案: -