Java Listen und Iterator

Gansa

Aktives Mitglied
Guten Tag, ich habe ein kleines Java Programm über das Josephs Problem. Ich habe 7 Personen und eine Schrittweite von 2, so dass am Ende die 7te Person überlebt. Ich habe eine Klasse Person wo ich die Anzahl der Personen als Name Speicher und als Zirkel wiedergeben kann bspw: (1,2,3,4,5,6,7). In meinem Code habe ich nur zwei Zeilen das mich etwas verwirrt das wäre die Zeile 21( iter = getNewIterator(iter, list1); ) und 30 ( iter = getNewIterator(iter, list1); ) wieso muss ich diese Methode getNewIterator aufrufen und wieso muss ich da jedes mal den iterator und die Liste mitgeben? Und wenn ich in der Methode getNewIterator:

if (!iter.hasNext()) {
return iter = list1.iterator();
}

diesen Teil realisiere, beginnt dann die Liste einfach von vorne zu iterieren falls ich das richtig verstanden habe? Danke schon mal wen mir jemand meine Verwirrung auflösen kann!

Java:
import java.util.Iterator;
import java.util.LinkedList;


public class Josephus {

    public Josephus(int size, int step) {

        LinkedList<Person> list1 = new LinkedList<Person>();

        for (int i = 1; i <= size; i++) {
            list1.add(new Person("" + i));
        }

        Iterator<Person> iter = list1.iterator();

        while (list1.size() > 1) {

            for (int j = 1; j < step; j++) {
                iter.next();
                iter = getNewIterator(iter, list1);
            }

            Person person = iter.next(); //speicher die zweite Person hier

            System.out.println("Circle: " + list1);
            System.out.println("Leaving: " + person.getName());

            iter.remove(); //löscht das Elemnt was von next geholt wurde, in dem Fall die zweite Person
            iter = getNewIterator(iter, list1);

        }
        System.out.println(list1.getFirst().getName());

    }

    private Iterator<Person> getNewIterator(Iterator<Person> iter, LinkedList<Person> list1) {
        if (!iter.hasNext()) {
            return iter = list1.iterator();
        }
        return iter;
    }


}
 
Klasse Person:

Java:
public class Person {

    private String name;



    public Person(String name){
        this.name = name;
    }

    public void setName(String name){
        this.name = name;
    }

    public String getName(){
        return this.name;
    }

    public String toString(){
        return this.getName();
    }
}
 
wieso muss ich diese Methode getNewIterator aufrufen ... diesen Teil realisiere, beginnt dann die Liste einfach von vorne zu iterieren falls ich das richtig verstanden habe?
Ja, du hast schließlich einen Kreis. Wenn du am Ende bist musst du wieder vorne anfangen. Innerhalb von getNewIterator wird bei dir überprüft ob der Iterator am Ende ist.

wieso muss ich da jedes mal den iterator und die Liste mitgeben?

Weil die Parameter keine Klassen-Felder sind. Insgesamt hat der Konstruktor eh zu viel Logik. Ein Konstruktor erstellt normalerweise etwas, z.B. den Kreis. Besser wäre es die Personen mit einer anschließenden Methode zu eliminieren.

Java:
Person lastManStanding = new Josephus(7).eliminate(2);
 

Neue Themen


Zurück
Oben