java - 同一对象上的多个数据结构

标签 java data-structures dictionary

设 Person 是一个具有 name、age 和 idNumber 属性的类。我想要一个“Persons”的集合,并且我希望能够以最有效的方式执行以下操作:

  1. 通过 idNumber 检索它们。
  2. 获取年龄 > X 的人员列表。
  3. 获取按姓名字母顺序排列的所有人员的列表。

我的想法是同时维护一个使用 id 作为键的 Hashmap 和两个使用年龄和名称作为每个 TreeMap 的键的 Treemap。

  1. 这是最好的方法吗?
  2. 在编辑年龄之前是否有必要从年龄 TreeMap 中删除一个人,然后将其放回原处?
  3. 如果问题 2 的答案是肯定的,当这些人员在多个地方被使用并可能被编辑时,我该如何处理?

最佳答案

Is this the best way?

我想说,使用关系数据库和适当的索引是最好的方法,但如果您想在内存中执行此操作,那么是的 - 您正在为了性能而牺牲内存。

Is it necessary to remove a person from the age TreeMap before editing the age to then put it back in?

是的。项目在树中的位置在添加时确定一次。如果可比属性(agename)发生变化,TreeMap 不会神奇地发现并移动对象。这很可能会导致无法在 map 中找到元素,即使它在那里。

If answer to question 2 is yes, how do I handle that when that persons are being used and potentially being edited on multiple places?

首选不可变对象(immutable对象),因此不可能更改已放置在树中的对象。如果出于任何原因您无法承担费用,请考虑 模式 - 在 map 中存储 Person 时,在该 Person 中注册一个监听器。当例如age 发生变化,监听器通知一棵树(或另一个观察者)按年龄存储人员并处理删除和添加回来。

顺便说一句,如果您在修改对象后尝试删除该对象,您将会失败 - TreeMap 将无法再找到要删除的对象...

关于java - 同一对象上的多个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155068/

相关文章:

java - jprogressbar 可见并且正在单击按钮

c++ - 定长结构重新排列 : should I use array or linked list?

mysql - 是否可以在单个查询中查询 MySQL 中的树结构表到任何深度?

javascript - d3 geo - map 投影

python - Python内存中的时间到期字典

performance - 存储和检索 DAWG 数据结构以实现快速加载的最佳方法

java - Eclipse 调试器指向源代码中的错误行

java - null 检查语句是否在 java 中不起作用

javascript - HTTP 状态 500 – 内部服务器错误,同时使用 esign genie api 在 vm 中下载 excel 文件

更改单链表中节点的顺序