你似乎在说你想要一个对象的引用在Map中作为一个键,用另一个恰好相等的对象来找到它 Object::equals 合同。 虽然我还没有尝试过这个代码,但我想你可以通过 Set Map上的钥匙。然后转换为 List . 在该列表中找到所需的对象,从列表的元素中检索引用。
Map< Car , Integer > map = … ;
Car car = new Car( … ) ;
map.put( car , 42 ) ;
Set< Car > carSet = map.keySet() ;
List< Car > carList = List.copyOf( carSet ) ;
Car similarCar = … ;
int index = carList.indexOf( similarCar ) ;
Car originalCar = carList.get( index ) ;
boolean same = ( car == originalCar ) ;
K keyToLookup = ...;
Entry<K,V> entry = map.ceilingEntry(keyToLookup);
if (entry != null && entry.getKey().equals(keyToLookup)) {
K originalKey = entry.getKey();
V value = entry.getValue();
// code here
} else {
// key not found
}
3条答案
按热度按时间uxhixvfz1#
你似乎在说你想要一个对象的引用在Map中作为一个键,用另一个恰好相等的对象来找到它
Object::equals
合同。虽然我还没有尝试过这个代码,但我想你可以通过
Set
Map上的钥匙。然后转换为List
. 在该列表中找到所需的对象,从列表的元素中检索引用。您还可以从密钥集生成流,在第一次匹配时停止流,同时搜索匹配项。
wlp8pajw2#
无法从数据库检索原始密钥
HashMap
,而不是像这样进行暴力顺序搜索:选项1:嵌入键值
解决方案
HashMap
当然是将键对象作为值的一部分:通过实际将键对象作为值对象的一部分,这通常是固有的,例如用户名到用户对象的Map。可能需要修改值对象,并且在更新Map条目以引用其他值对象时,可能需要删除和重新添加Map条目。
在一个单独的
Map<K, K>
. 效率较低,因为你要查两遍。通过将值更改为键/值对,例如。
Map<K, Entry<K, V>>
. 这可能是最好的解决方案,但需要注意确保条目的key对象始终是原始的key。选项2:使用navigablemap
如果
Map
可以从HashMap
成为一个NavigableMap
,例如TreeMap
,它支持从Map中检索原始密钥对象,例如使用ceilingEntry(K key)
方法。关键对象必须实现
Comparable
或者TreeMap
可以使用自定义Comparator
. 无论哪种情况,实现都必须与equals保持一致。并非所有键类型都可以定义相对顺序,因此可能无法使用
NavigableMap
.yzxexxkh3#
想要获得密钥的“原始”是相当奇怪的…通常,用新创建的密钥进行轮询是“便宜”的,它们可以在以后被垃圾收集。我猜你有一个相当奇特的用例。
也就是说,你不可能用一个
HashMap
开箱即用。你能做的最接近的就是扩展它来暴露getNode(...)
方法,允许您访问密钥。