【问题标题】:Multiple data structures over the same objects同一对象上的多个数据结构
【发布时间】:2012-04-14 16:04:48
【问题描述】:

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

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

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

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

【问题讨论】:

  • 如果id 将(大部分)连续,您不妨使用普通数组。
  • 这是“国民身份证号码”,不是连续的:)
  • 对于名称,您应该考虑使用trie
  • 我不明白前缀树如何帮助我。我不想要一个名字的集合,而是一个有名字的对象的集合。我如何在 Trie 上做到这一点?
  • 这是作业,对吧?

标签: java data-structures map


【解决方案1】:

这是最好的方法吗?

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

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-08-09
    • 1970-01-01
    • 2012-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多