【问题标题】:what to use for this requirement, Array, List, Map,?使用什么来满足这个要求,Array,List,Map,?
【发布时间】:2012-04-29 23:19:08
【问题描述】:

在制作我的程序时,我遇到了这个要求,我必须为我创建的一些对象分配唯一的 ID。现在我在 GUI 上动态创建对象,最初我使用简单的计数器将 int 值分配给创建的节点,它工作得很好。

但是,这种方法产生的问题是,如果在创建 GUI 时,如果必须删除某个节点,则该 id 也会被删除并且不再使用。对于下一个新节点,每次我必须使用最新的计数器值,如果在此过程中删除节点,这会产生大量缺失的 int 值。

我想在创建新节点时重用那些丢失的 id,为此我很困惑我应该添加哪种方法。

我的想法:

  1. 使用包含可用值的 ArrayList,以及如果一个节点 被删除,它的 id 被添加到这个列表中,我对这个列表进行排序并使用 新节点的最小值。很好,但是,当我使用这个值时,如果 我从列表中删除它,索引没有被删除,这导致 问题。
  2. HashMap,与上面类似,我添加了可用的 id 并删除了未使用的,但不确定如何对这个 hashMap 进行排序???

你能建议我应该怎么做吗?可能我需要某种堆栈,我可以在其中推送值,对其进行排序并使用最小值,如果我使用了,它会从这个堆栈中删除,请给出一些关于如何完成这个任务的想法???

【问题讨论】:

  • 重复使用丢失的 id 有什么实际好处,还是只是为了好玩?
  • @mellamokb,只是一个外观问题,否则 id 仍然是独一无二的,没有问题,但如果它很容易,我想这样做
  • id 空间中的空白是否有任何实际后果?你aren't将它们存储在一个数组中,是吗?
  • @mellamokb,这是一个很好的观点。数据库不会通过尝试重用旧标识符来分配数字键。除非有充分的理由,否则每次增加都会更有效率,仅此而已。
  • @911TurboS 即使有一个简单的方法可以做到这一点,除非你有充分的理由,否则你仍然在浪费资源来重新分配已删除的 id

标签: java arrays list hashmap


【解决方案1】:

您可以使用TreeSet(它会自动将添加的所有条目从最小到最大排序)来存储已删除的ID(myTreeSet.add(old_id))。这样,当您创建一个新实例时,您将首先检查TreeSet 中是否有任何条目。要获取最低值,您将使用myTreeSet.first()(应该是O(1) 操作)。如果TreeSet 为空,这意味着所有已知的 id 当前都在使用中,那么您将继续使用下一个可用的 id 正常。

【讨论】:

  • 谢谢我也去看看这个,以前没用过听起来很有前途的方法
【解决方案2】:

保留已删除 ID 的列表,当您创建新节点时,检查该列表是否有要重复使用的 ID(无论您使用哪个 ID);如果列表是空的(因为它最初是空的),则以“旧方式”获取一个新 ID。更聪明的是:使列表成为一个对象,如果其中没有任何已删除的 ID,则该对象将生成一个新 ID,因此调用者不必担心 ID 是如何到达的。

【讨论】:

  • +1。可能我会怎么做,假设重用 id 很重要。
  • 这比我想要的要多,我现在就试试看
  • 感谢这是我使用的,我只需调用 getID() 就可以了,最终使用包含已删除 ID 的 ArrayList,如果它为空,只需使用计数器值,即可完美运行,再次感谢; )
【解决方案3】:

第一个解决方案只有在节点很少的情况下才能正常工作!想象一个有数千个节点的应用程序!内存消耗呢? Hashmap 解决方案更适合您的目标并且需要更少的控制。

【讨论】:

  • 是的,但节点将映射到实际的物理节点,在我们的测试平台中,它们最多为 20-30 个,所以这不是一个大问题
  • 事实上更多的资源浪费问题是扫描整个场景以找出删除/丢失的 id :)
  • 重点是!您必须多久访问一次 ArrayList?如果每次执行必须重复一次操作是可以的!一万次开销太大了!您必须检查内存和 cpu 使用情况!
【解决方案4】:

TreeSet 来存储使用的 ID 怎么样?然后,您可以使用higher(0) 找到最低的免费 ID。如果它返回null,那么你就知道你没有使用过的ID。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-02-06
    • 1970-01-01
    • 1970-01-01
    • 2011-11-28
    • 1970-01-01
    • 1970-01-01
    • 2012-06-20
    相关资源
    最近更新 更多