最有效地实施ID跟踪系统

时间:2018-02-08 01:39:28

标签: java

我目前正在研究一个简单的ID跟踪系统,用于我正在研究的“游戏”。我希望在任何给定的时间屏幕上都有几百个对象。

其中许多对象需要与其他特定对象进行交互,但这些对象很快就会被创建和销毁。

我想实现ID系统以跟踪使用哪个ID。

由于程序的性质,我希望能够在销毁对象并将其标记为可用后重用ID。

这是我如何有效地做到这一点的思考过程:

  • 我不想循环浏览所有当前ID以检查是否有可用
  • 关于是否采用该ID的简单是或否答案
  • 这可以使用布尔数组来完成,但是数组仅限于它的初始大小
  • 这可以通过列表来完成,但我需要为列表中的每个数字创建一个新对象,否则我需要遍历列表。
  • 最好的选择是像对象这样的数组,每个位置都标记为false,只有在完成该数字后才标记为true,然后在完成时返回false

这样的事情:

IDTracker tracker = new IDTracker();

public boolean checkID(int numToCheck) {
    return tracker.get(numToCheck);
}

//returns true if successful
public boolean takeID(int numToTake) {
    if(!checkID(numToCheck)) {
        tracker.set(3) = true;
        return true;
    }
    return false;
}

//returns true if successful
public void releaseID(int numToRelease) {
    if(checkID(numToCheck)) {
        tracker.set(3) = false;
        return true;
    }
    return false;
}

我知道如何使用List执行此操作,但这需要一个10k + ID的布尔对象。有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你需要的是一套。

https://docs.oracle.com/javase/7/docs/api/java/util/Set.html

  

不包含重复元素的集合。

Set<Integer> tracker = new HashSet<>();

public boolean checkID(int numToCheck) {
    return tracker.contains(numToCheck);
}

public boolean takeID(int numToTake) {
    if(!checkID(numToTake)) {
        tracker.add(numToTake);
        return true;
    }
    return false;
}

public void releaseID(int numToRelease) {
    if(checkID(numToRelease)) {
        tracker.remove(numToRelease);
        return true;
    }
    return false;
}