标题可能有点令人困惑,但我真的不知道如何解释这个。我有一个对象列表,在这种情况下,是位置,这些位置可以被玩家占用。如果所选位置已被占用,我该如何尝试查找新位置,并继续此操作直到找到非占用位置?
我已经知道有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 */
}
对不起,如果你不明白,我不知道解释这个的好方法。
答案 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)
您可以选择以下两种方式之一:
推送 - 当某个位置可用时,通知它现在可用。 (例如,通过调用方法)。
轮询:你现在正在做的事情。可以保存可用位置的集合,当位置变得可用时,它将被添加到集合中。您可以等待列表具有值。我建议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)
而不是随机探测,直到你找到一个空位,你应该
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()));