# Wie kann ich einen array zufällig durchlaufen?



## Sasuke303 (17. Jun 2022)

Die Aufgabenstellung lautet wie folgt:

Hotels sollen über eine Methode checkIn verfügen, die als Eingabe eine Person übergeben bekommt, und diese Person dann zufällig in eines der freien Zimmer einbucht und true zurückgibt. Sind jedoch keine Zimmer mehr frei, soll die Methode false zurückgeben.

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

Kann mir jemand bitte helfen?


----------



## httpdigest (17. Jun 2022)

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 (17. Jun 2022)

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


```
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 (19. Jun 2022)

Hier noch zwei Ansätze, die man in der Praxis aber in der Regel *nicht* will:

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.
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  SCNR. Auch hier müsste man sich merken, wie viele Zimmer noch frei sind.


----------



## KonradN (19. Jun 2022)

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 (19. Jun 2022)

@KonradN, ah, habe vergessen dazuzuschreiben, dass


httpdigest hat gesagt.:


> 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


----------



## shokwave (20. Jun 2022)

Wie wäre ein Array bzw. eine ArrayList mit den Indizes der freien Zimmer und daraus dann eines zufällig wählen?


----------



## Robert Zenz (20. Jun 2022)

shokwave hat gesagt.:


> Wie wäre ein Array bzw. eine ArrayList mit den Indizes der freien Zimmer und daraus dann eines zufällig wählen?



Wieso machst du dann nicht einfach eine Liste mit freien Zimmern und waehlst daraus ein zufaelliges?


----------



## shokwave (20. Jun 2022)

Robert Zenz hat gesagt.:


> Wieso machst du dann nicht einfach eine Liste mit freien Zimmern und waehlst daraus ein zufaelliges?



Ich sollte wohl an meiner Formulierung arbeiten, damit es nicht so klingt, als sei ich der TE...😏


----------



## Robert Zenz (20. Jun 2022)

shokwave hat gesagt.:


> Ich sollte wohl an meiner Formulierung arbeiten, damit es nicht so klingt, als sei ich der TE...😏



Meine Frage bleibt aber. Bevor du eine Liste an Indizes herumschleifst, warum dann nicht gleich eine Liste mit den freien Zimmern?


----------



## shokwave (21. Jun 2022)

OK, jetzt hab ich's geschnallt! 😆


----------

