设 Person 是一个具有 name、age 和 idNumber 属性的类。我想要一个“Persons”的集合,并且我希望能够以最有效的方式执行以下操作:
- 通过 idNumber 检索它们。
- 获取年龄 > X 的人员列表。
- 获取按姓名字母顺序排列的所有人员的列表。
我的想法是同时维护一个使用 id 作为键的 Hashmap 和两个使用年龄和名称作为每个 TreeMap 的键的 Treemap。
- 这是最好的方法吗?
- 在编辑年龄之前是否有必要从年龄 TreeMap 中删除一个人,然后将其放回原处?
- 如果问题 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?
是的。项目在树中的位置在添加时确定一次。如果可比属性(age
或 name
)发生变化,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对象),因此不可能更改已放置在树中的对象。如果出于任何原因您无法承担费用,请考虑 observer模式 - 在 map 中存储 Person
时,在该 Person
中注册一个监听器。当例如age
发生变化,监听器通知一棵树(或另一个观察者)按年龄存储人员并处理删除和添加回来。
顺便说一句,如果您在修改对象后尝试删除该对象,您将会失败 - TreeMap
将无法再找到要删除的对象...
关于java - 同一对象上的多个数据结构,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10155068/