我想在以下规则中为对象生成ID号: 每个新对象都将获得一个唯一的ID号(第一个将是1), 然后每个新对象将获得最低的可用ID号。
例如,如果我声明4个对象 对象1 ID:1 对象2 ID:2 对象3 ID:3 对象4 ID:4
然后如果我删除对象编号3。 所以下一个要做的对象将得到ID:3而不是5。
做ID生成器的最佳方法是什么?
答案 0 :(得分:2)
我假设你想用Java做。我建议如下:
拥有一个用于为实体提供ID的序列。这很简单,我认为不需要详细解释 - 它只返回1,2,3等。
现在我们需要处理删除。连同序列我建议删除SortedSet
个ID,并将其分配给新实体。
将这两个结构放在一起,就像:
如果set不为空,则返回其第一个值并将其从集合中删除。它将是最低值,因为您使用SortedSet
。
如果为空,只需从序列中返回下一个数字。
当然,你需要处理这个操作的原子性并且可能会遇到并发问题,但对于这个问题IMO来说,对它的详细讨论有点偏离。
答案 1 :(得分:0)
您可以ConcurrentHashMap<Integer, Boolean>
设置要使用的唯一ID。使用Boolean
值检查它们是否已被使用。然后,使用ConcurrentHashMap<YourObject, Integer>
将所需对象存储在其相关ID中。由此,您必须手动同步两个结构的添加/删除,以始终定义可用的最低密钥。
请注意,所有这些都非常昂贵且难以维护。最好使用第三方元素(可能是嵌入式数据库?)来处理所有这些问题。
答案 2 :(得分:0)
注意:这是我的方式,因为我不知道列表。如果有一个列表在没有算法的情况下以某种方式完成此问题,那就太好了。不要因为没必要而拒绝我的回答。
我想你可以拥有一个ArrayList,只需从中添加ID,并始终使用最低的ID。
例如:
static ArrayList<Integer> ids = new ArrayList<Integer>();
public static void assignId() {
boolean foundId = false;
for (int i = 0; i < ids.size(); i++) {
if (ids.get(i) < 0) { // if it's negative, it was removed before
// make object ID to be i+1
ids.set(i, i+1); // and add it to the list
foundId = true;
break;
}
}
if (!foundId) { // can't find ID mid list to fill in
ids.add(ids.size()+1); // so give it a brand new one
}
}
public static void removeId(int id) {
ids.set(id-1, -1); // negative value means it was removed
}
所以我所做的是创建一个列表,该列表具有ID的正值,而在曾经是id的地方创建负值,但不再是。这样做的原因是,如果列表中的值为负数,我们可以替换它。例如:
// assign five IDs (1 through 5)
assignId();
assignId();
assignId();
assignId();
assignId();
// print ids for testing
for (int id : ids) {
System.out.print(id + ", ");
}
// outputs 1, 2, 3, 4, 5,
// now remove the id 3
removeId(3);
removeId(2);
// print ids for testing
for (int id : ids) {
System.out.print(id + ", ");
}
// outputs 1, 2, -1, 4, 5,
assignId(); // give this new object a new id (should be 2 replacing -1)
// print ids for testing
for (int id : ids) {
System.out.print(id + ", ");
}
// outputs 1, 2, -1, 4, 5,
assignId(); // give this new object a new id (should be 3 replacing -1)
// print ids for testing
for (int id : ids) {
System.out.print(id + ", ");
}
// outputs 1, 2, 3, 4, 5,
assignId(); // give this new object a new id (should a brand new ID)
// print ids for testing
for (int id : ids) {
System.out.print(id + ", ");
}
// outputs 1, 2, 3, 4, 5, 6,