为每个对象实例生成可能的最低ID号 - java

时间:2014-05-03 16:38:04

标签: java unique-key

我想在以下规则中为对象生成ID号: 每个新对象都将获得一个唯一的ID号(第一个将是1), 然后每个新对象将获得最低的可用ID号。

例如,如果我声明4个对象 对象1 ID:1 对象2 ID:2 对象3 ID:3 对象4 ID:4

然后如果我删除对象编号3。 所以下一个要做的对象将得到ID:3而不是5。

做ID生成器的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

我假设你想用Java做。我建议如下:

  1. 拥有一个用于为实体提供ID的序列。这很简单,我认为不需要详细解释 - 它只返回1,2,3等。

  2. 现在我们需要处理删除。连同序列我建议删除SortedSet个ID,并将其分配给新实体。

  3. 将这两个结构放在一起,就像:

    • 如果set不为空,则返回其第一个值并将其从集合中删除。它将是最低值,因为您使用SortedSet

    • 如果为空,只需从序列中返回下一个数字。

  4. 当然,你需要处理这个操作的原子性并且可能会遇到并发问题,但对于这个问题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,