如何在找到可用对象之前尝试一些东西

时间:2013-11-17 11:50:08

标签: java

标题可能有点令人困惑,但我真的不知道如何解释这个。我有一个对象列表,在这种情况下,是位置,这些位置可以被玩家占用。如果所选位置已被占用,我该如何尝试查找新位置,并继续此操作直到找到非占用位置?

我已经知道有20个位置,我可以手动检查每个位置,看看它是否被占用,但是有更好的方法吗?

以下是我的代码片段。

List<Location> spawnList = arena.getManager().getRandomSpawns(); // Returns a list of possible locations
Location random = spawnList.get(new Random().nextInt(spawnList.size())); // Selects a random location from the list

if (random.isOccupied()) {
    /* Location is occupied, find another one from the list, and continue doing this until non-occupied location is found */
}

对不起,如果你不明白,我不知道解释这个的好方法。

5 个答案:

答案 0 :(得分:1)

List<Location> spawnList = arena.getManager().getRandomSpawns();
Location random;
Random r = new Random();

do {
  random = spawnList.get(r.nextInt(spawnList.size()))
} while(random.isOccupied());

如果所有位置都被占用,则会失败,您应该先检查一下。

答案 1 :(得分:0)

您可以选择以下两种方式之一:

  1. 推送 - 当某个位置可用时,通知它现在可用。 (例如,通过调用方法)。

  2. 轮询:你现在正在做的事情。可以保存可用位置的集合,当位置变得可用时,它将被添加到集合中。您可以等待列表具有值。我建议A blockig queue

答案 2 :(得分:0)

您可以声明一个标志来检查是否找到候选位置,并使用while - loop生成随机位置,例如,

    Location random = null;

boolean foundLocation = false;
while(!foundLocation)
{
    random = spawnList.get(new Random().nextInt(spawnList.size()));
    if(!random.isOccupied())
    {
        foundLocation = true;
    }
}

注意:以下假设位置列表中至少有一个位置未被占用。如果所有位置都被占用。那么上面的代码就不能使用了。它将处于无限循环中。我们最好先检查列表中是否至少有一个位置未被占用。

答案 3 :(得分:0)

简单的方法是在循环中随机化一个位置,直到找到一个位置:

List<Location> spawnList = arena.getManager().getRandomSpawns(); // Returns a list of possible locations
Location random = spawnList.get(new Random().nextInt(spawnList.size())); // Selects a random location from the list

while (random.isOccupied()) {
    random = spawnList.get(new Random().nextInt(spawnList.size()));
}

这里的问题是,如果大多数地点已被占用,这可能需要很长时间。

一种“更安全”的方法,承诺相同的性能顺序,无论预占位置的百分比如何,都可以对位置列表进行混洗,然后简单地遍历它:

List<Location> spawnList = new LinkedList<Location>(arena.getManager().getRandomSpawns());
Location random = null;

for (Location loc : spawnList) {
    if (!loc.isOccupied()) {
        random = loc;
    }
}

答案 4 :(得分:0)

而不是随机探测,直到你找到一个空位,你应该

  1. 首先收集所有可用的位置,然后
  2. 选择一个随机的免费位置。

  3. List<Integer> freeLocations = new ArrayList<>();
    for (int i = 0; i < spawnList.size(); i++)
      if (!spawnList.get(i).isOccupied) freeLocations.add(i);
    
    Location random = 
       spawnList.get(freeLocations.get(rnd.nextInt(freeLocations.size()));