什么用于此要求,数组,列表,地图,?

时间:2012-04-18 14:11:26

标签: java arrays list hashmap

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

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

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

我的想法:

  1. 使用包含可用值的ArrayList,以及节点 被删除,它的id被添加到此列表中,我对此列表进行排序并使用 新节点的最小值。很好但是,当我使用这个值时,如果 我从列表中删除它,索引不会被删除,这会导致 问题。
  2. HashMap,类似上面我添加可用的id并删除未使用但不确定如何对此hashMap进行排序???
  3. 你能建议我该怎么做吗?可能是我需要某种堆栈,我可以推送值,排序并使用最小值,如果我使用它,它从这个堆栈中删除,请给出一些关于如何完成此任务的想法?< / p>

4 个答案:

答案 0 :(得分:4)

保留已删除ID的列表,并在创建新节点时,检查该列表以查找要重复使用的ID(与您采取的无关);如果列表为空(如最初的那样),则获取新ID“旧方式”。更聪明的是:如果列表中没有任何已删除的ID,则将列表设置为生成新ID的对象,这样调用者就不必担心ID到达的位置。

答案 1 :(得分:3)

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

答案 2 :(得分:1)

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

答案 3 :(得分:0)

只有节点很少时,第一个解决方案才能正常工作!想象一下拥有数千个节点的应用程序!内存消耗怎么样? Hashmap解决方案更适合您的目标,需要更少的控制。