java - 更新 Set 中的对象

标签 java data-structures set

假设我的应用程序中有这种类型:

public class A {
  public int id;
  public B b;

  public boolean equals(Object another) { return this.id == ((A)another).id; }
  public int hashCode() { return 31 * id; //nice prime number }
}

和一个Set<code><A</code>>结构体。现在,我有一个 A 类型的对象并希望执行以下操作:

  • 如果我的A在集合内,更新其字段 b以匹配我的对象。
  • 否则,将其添加到集合中。

因此检查它是否在其中很容易 ( contains ),添加到集合中也很容易。我的问题是:如何获得句柄来更新其中的对象?接口(interface)Set没有 get方法,我能想到的最好的方法是删除集合中的对象并添加我的。另一种更糟糕的替代方法是使用迭代器遍历集合以尝试定位对象。

我很乐意接受更好的建议...这包括有效使用其他数据结构。

尤瓦尔=8-)

编辑:谢谢大家的回答...不幸的是,我不能“接受”这里的最佳答案,那些建议使用 Map 的答案。 ,因为仅仅为了这个目的彻底改变集合的类型会有点极端(这个集合已经通过 Hibernate 映射了......)

最佳答案

由于 Set 只能包含对象的一个​​实例(由其 equalshashCode 方法定义),只需将其删除然后添加即可。如果已经有一个,那么另一个将从集合中删除并替换为您想要的那个。

我有做类似事情的代码 - 我正在缓存对象,以便某个特定对象出现在 GUI 上的一堆不同位置的任何地方,它总是相同的。在这种情况下,我没有使用 Set,而是使用了 Map,然后我得到了一个更新,我从 Map 中检索它并就地更新它,而不是创建一个新实例。

关于java - 更新 Set 中的对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/175186/

相关文章:

Python多重交集

java - 如何在 StringProperty 和组合框 SelectedItemProperty 之间进行双向绑定(bind)

c++ - 删除链表的最后一个节点后内存未释放

c - 为什么我的程序突然终止?

python - 创建一个允许调整基值的属性类?

python - 为什么使用字典测试包含比使用集合测试更快?

java - 单链表 : How to add the head

java - java中无法解决导入问题

java - 在 ConcurrentModificationException 之后,Java 集合是否保证处于有效、可用的状态?

c++ - 使用 map 内存