Wie kann ich einen array zufällig durchlaufen?

Sasuke303

Neues Mitglied
Die Aufgabenstellung lautet wie folgt:

Hotels sollen über eine Methode checkIn verfügen, die als Eingabe eine Person übergeben bekommt, und diese Person dann zufällig in eines der freien Zimmer einbucht und true zurückgibt. Sind jedoch keine Zimmer mehr frei, soll die Methode false zurückgeben.

Ich komme hier einfach nicht weiter, wie man den array zufällig durchläuft..

Kann mir jemand bitte helfen?
 

httpdigest

Top Contributor
Die einfachste Variante wäre vermutlich, einmal eine zufällige Permutation des Arrays als Liste zu generieren mittels Arrays.asList() und Collections.shuffle() und diese dann sequenziell von vorne zu durchlaufen, bis man den ersten freien Platz gefunden hat.
Wie du das Zimmer dann belegst, kommt darauf an, wie du es modelliert hast.
Wenn die Zimmer im Array (modelliert als Zimmer[]) generell alle existieren und lediglich als Instanzvariable die Person halten, die gerade im Zimmer ist, dann könnte man in der Schleife einfach die Zuweisung von Person an Zimmer direkt setzen.
Wenn das Array der Zimmer aber einfach nur als Person[] Array modelliert ist (und die Zimmer, die nicht besetzt sind, einfach null sind), ginge das so nicht, weil man nicht mehr wüsste, an welchem Index im Array man jetzt eigentlich in der geshuffelten Liste ist.
 

Robert Zenz

Top Contributor
Man kann auch die Liste kopieren und dann zufaellig einen Eintrag herausnehmen bis die Liste leer ist. So in etwa:

Java:
List<Item> copiedList = new ArrayList<>(originalList);

while (!copiedList.isEmpty()) {
    Item item = copiedList.remove(random.index());
}

So oder so muss man zumindest die Liste (nicht jedoch die Objekte) einmal kopieren, je nach Groesze der Liste kann das bedenklich werden. Aber bei dir klingt das nicht so als waere das ein Problem.
 

mihe7

Top Contributor
Hier noch zwei Ansätze, die man in der Praxis aber in der Regel nicht will:
  1. Man kann sich merken, wie viele freie Zimmer man hat. Dann wählt man zufällig eine Ganzzahl n (mit 1 <= n <= freie Zimmer) und bucht das n-te freie Zimmer, das in einer Schleife ermittelt wird. Die Laufzeit ist natürlich miserabel.
  2. Oder, der Klassiker: so lange zufällig einen Index wählen, bis man ein freies Zimmer gefunden hat. Da ist dann sogar die Laufzeit zufällig :p SCNR. Auch hier müsste man sich merken, wie viele Zimmer noch frei sind.
 

KonradN

Super-Moderator
Mitarbeiter
Wobei die einfachste Lösung mit Arrays ja ist, dass man sich die Anzahl der freien Zimmer merkt. Und man nimmt dann einfach eine Zufallszahl, die den Index angibt. Bei der Belegung muss dann dieses belegte Zimmer mit dem letzten freien Zimmer getauscht werden, so dass man immer den Zustand hat im Array, dass erst alle freien Zimmer kommen und dann alle belegten Zimmer.

Dann hätte man eine Lösung ohne irgendwelche Klassen des Frameworks zu nutzen.
 

mihe7

Top Contributor
@KonradN, ah, habe vergessen dazuzuschreiben, dass
Wenn das Array der Zimmer aber einfach nur als Person[] Array modelliert ist (und die Zimmer, die nicht besetzt sind, einfach null sind), ginge das so nicht, weil man nicht mehr wüsste, an welchem Index im Array man jetzt eigentlich in der geshuffelten Liste ist.
die Motivation hinter meinen zwei "Lösungen" war :)
 

Neue Themen


Oben