Как сделать круговой цикл Ява - PullRequest
0 голосов
/ 21 января 2019

Это проблема DuckDuckGoose.Последний цикл while не является круговым списком.Как сделать его круглым, чтобы его можно было удалить, а затем перейти к следующему, а затем перейти к другому сегменту списка и перейти к следующему случайному числу в списке.Я должен использовать класс итератора без индексов.Потому что iterator.hasNext() идет только до конца списка, а не по кругу.Как сделать так, чтобы цикл while делал список круглым и получал одного победителя?

19 имен

http://collabedit.com/q248e

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;
    }

}

Ответы [ 2 ]

0 голосов
/ 21 января 2019
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();
}
0 голосов
/ 21 января 2019

Просто добавьте цикл 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, и вы запускаете внутренний цикл while с двумя игроками, player1 и player2.
getRandomBoolean() возвращает true, player1 удалено
getRandomBoolean() снова возвращает true, player2 удаляется.
Обе while петли останавливаются, но ваш список теперь пуст.

...