这是DuckDuckGoose的问题。最后一个while循环不是循环列表。如何使它变成圆形,以便可以将其删除,然后再移至下一步,然后移至列表的其他部分,移至列表中的下一个随机数。我必须使用没有索引的迭代器类。因为iterator.hasNext()
仅上升到列表的末尾,而不是循环的。如何使while循环使列表循环并最终获得一名获胜者?
19个名字
public class DuckDuckGoose {
public static void main(String[] args) {
LinkedList<String> linkedlist = new LinkedList<String>();
// add try catch to add list
try {
FileReader fr = new FileReader("C:\\Users\\src\\players.txt");
Scanner inFile = new Scanner(fr);
while (inFile.hasNextLine()) {
linkedlist.add(inFile.nextLine());
}
} catch (FileNotFoundException e) {
e.printStackTrace();
}
Iterator<String> iterator = linkedlist.iterator();
while (iterator.hasNext()) {
iterator.next();
// random number Goose landed method
if (getRandomBoolean()) {
iterator.remove();
}
}
System.out.println(linkedlist);
}
public static boolean getRandomBoolean() {
return Math.random() < .80;
}
}
答案 0 :(得分:0)
只需在while循环的顶部添加一个while循环:
while(linkedlist.size() > 1){
iterator = linkedlist.iterator();
while (iterator.hasNext()) {
iterator.next();
// random number Goose landed method
if (getRandomBoolean()) {
iterator.remove();
}
if(linkedlist.size() == 1) break;
}
}
现在请注意,我在原始循环中添加了一个break
语句。这是为了确保我们始终在您的列表包含1个玩家时停止播放,而不是在列表为空时停止播放。
为说明这一点,假设我们没有那个break
语句,而您是由两个玩家player1
和player2
开始while循环的。
getRandomBoolean()
返回true,player1
被删除
getRandomBoolean()
再次返回true,player2
被删除。
两个while
循环都停止了,但是您的列表现在为空。
答案 1 :(得分:0)
public static void main(String... args) throws IOException {
List<String> players = Files.readAllLines(Paths.get("c:/Users/src/players.txt"));
String winner = getWinner(players);
System.out.println("winner is " + winner);
}
public static String getWinner(List<String> players) {
players = new ArrayList<>(players);
Iterator<String> it = players.iterator();
Random random = new Random();
while (players.size() > 1) {
(it = it.hasNext() ? it : players.iterator()).next();
if (random.nextBoolean())
it.remove();
}
return players.iterator().next();
}