2

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

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

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

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

1 回答 1

2

这是最好的方法吗?

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

是否有必要在编辑年龄之前从年龄 TreeMap 中删除一个人,然后再将其放回?

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

如果对问题 2 的回答是肯定的,那么当这些人被使用并可能在多个地方被编辑时,我该如何处理?

首选不可变对象,因此无法更改已放置在树中的对象。如果出于任何原因您负担不起,请考虑模式 -Person在地图中存储 a 时,在其中注册一个侦听器Person。例如,当age发生变化时,侦听器通知按年龄存储人的树(或另一个观察者)并处理删除和添加。

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

于 2012-04-14T16:28:49.537 回答