1

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

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

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

我的想法:

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

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

4

4 回答 4

4

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

于 2012-04-18T14:15:59.577 回答
3

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

于 2012-04-18T14:14:39.647 回答
1

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

于 2012-04-18T14:18:12.150 回答
0

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

于 2012-04-18T14:17:27.657 回答