gpt4 book ai didi

java - 使用另一个对象及其哈希码从 HashMap 获取 key

转载 作者:行者123 更新时间:2023-12-05 07:54:30 25 4
gpt4 key购买 nike

假设我有一个包含大量对象的 map ,所有这些对象都包含大量杂项数据,在比较它们时会忽略这些数据(使用 .equals() )。例如,这个:

public class Complex {
private long id;
// Many other fields...

// Methods, getters, setters...

public boolean equals(Object obj) {
if (this == obj)
return true;
if (obj == null)
return false;
if (getClass() != obj.getClass())
return false;
Complex other = (Complex) obj;
if (id != other.id) // Note that only id is compared.
return false;
return true;
}
}

通过使用 myMap.get(new Complex(id));,我可以在恒定时间内轻松找到此映射或集合是否包含具有特定 ID 的键。或 mySetOrMap.contains(new Complex(id)); ,但不幸的是,这不是我所需要的。

我需要的是条目,包含原始键(其中包含所有杂项数据)和值。

我可能的解决方案如下:

  • 我可以轻松地遍历 hashmap,但这不会非常优雅或快速。
  • 我可以改变我的 map 的整个实现,所以它是一个 Map<Long, Entry<Complex, MyValueType>> , 但这似乎有点过分。
  • 我可以有另一个 map :Map<Long, Complex> ,这可能是最合理的。

总结:是否有一种优雅的方法来检索用于在映射中创建条目的原始 key ,假设您有一些与它具有相同哈希码的东西?

我确实在写完这篇文章后找到了一个 duplicate来自 4 多年前,但想知道我们是否可以修改答案(这是 Java 7 之前的版本)。

最佳答案

你只有两个选择:

a) 你创建第二张 map :Map<Long, Complex>查找相关的 Complex -object,就像你已经提到的,或者

b) 您遍历 map ,最好使用流:

Long searchID = 42L;
Map<Complex, MyValueType> x = new HashMap<Complex, MyValueType>();
Entry<Complex, MyValueType> y = x.entrySet()
.stream()
.filter(e -> e.getKey().getId().equals(searchID))
.findFirst()
.orElse(null);

顺便说一句:在 xtend(Java 的“插件”)中也是如此:

val Long searchID = 42L
val x = <Complex, MyValueType>newHashMap()
val y = x.filter[id==searchID]

我不会创建 Map<Long, Entry<Complex, MyValueType>>

什么最适合您取决于您​​的“环境”-> 有多少 RAM 可用/它需要多快。但我认为没有比这更“优雅”的方式了。

关于java - 使用另一个对象及其哈希码从 HashMap 获取 key ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31239225/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com