While- in For-Schleife umschreiben - JAVA

5 Antworten

Ist fast richtig. Nur wird bei der while Schleife das pos--; am Anfang gemacht und bei der for-Schleife am Ende jedes Durchlaufes.

Was die eigentliche Lösung angeht, so hat dir DoTheBounce bereits alles gesagt. Ergänzen könnte man noch, dass du die eigentliche Größe mittels der size Funktion wie bei der while-Schleife vorher einmal aufrufen solltest und in einer Variable speichern solltest. Geschieht dies nicht, so muss bei jeden Schleifendurchlauf die entsprechende Methode ausgeführt werden, was Rechenleistung kostet.

Woher ich das weiß:Berufserfahrung – Softwareentwickler/Projektleiter seit 2012

Nicht ganz. Der dritte Teil der for-Anweisung, bei - dir also das pos-- - wird immer erst nach dem Schleifenrumpf ausgeführt. Korrekt wäre z.B.

ArrayList<Rucksack> studentenRucksaecke = new ArrayList<Rucksack>();
...
for(int pos = studentenRucksaecke.size() - 1; pos >=0; pos--){
    studentenRucksaecke.get(pos).gewichtPruefen();
}  

oder

ArrayList<Rucksack> studentenRucksaecke = new ArrayList<Rucksack>();
...
for(int pos = studentenRucksaecke.size(); pos >=1; pos--){
    studentenRucksaecke.get(pos-1).gewichtPruefen();
}  

arno121212 
Beitragsersteller
 22.01.2015, 14:06

Vielen Dank. Hab es jetzt kapiert!

Ich wusste doch dass da irgendwo eine kleine Falle ist! Danke für die große Hilfe!!!

0

Warum rückwärts? So wäre der elegante Weg (For-Each-Schleife)

for( Rucksack rucksack : studentenRucksaecke ) {
    studentenRucksaecke.get(pos).gewichtPruefen();
}

ansonsten

For (int i= 0; i < studentenRucksaecke.size(); i++){
    studentenRucksaecke.get(i).gewichtPruefen();
}  

JavaTheHutt  22.01.2015, 15:13

In deiner ersten Schleife ist die Varaible "pos" nicht definiert. Bei einer ForEach-Schleife kann man direkt das Objekt, welches man im jeweiligen Schleifendurchlauf erhält, verwenden.

for( Rucksack rucksack : studentenRucksaecke ) {
    rucksack.gewichtPruefen();
}
0

Zunächst sollte man sich klar machen, wie Schleifen funktionieren.

In Abhängigkeit von einer Abbruchbedingung soll ein bestimmter Codeblock wiederholt abgearbeitet werden.

while – die (boolsche) Abbruchbedingung wird zunächst geprüft. Wenn sie noch nicht erfüllt ist, wird der Block durchlaufen. Ansonsten wird die Schleife gar nicht erst ausgeführt.

do while – der Schleifenrumpf wir mindestens einmal ausgeführt. Danach haben wir eine while-Schleife.

for – Diese Schleife hat in ihrem Klammerausdruck drei Komponenten. Die Initialisierung des Zählers, ein Prüfausdruck und das Dekrement bzw. Inkrement dieses Zählers. Sie wird im Rumpf wie jede while-Schleife abgearbeitet. Allerdings besteht das Problem, das man nur selten weiss, wie oft man die Schleife durchlaufen muß. Genau deswegen werden hauptsächlich while-Schleifen verwendet.

for each – Dieser Schleifentyp ist eine spezielle Anpassung für die objekt-orientierte Programmierung. Analog wie in der for-Schleife beschrieben, weiss man nicht die Anzahl der Objekte. Deswegen iteriert dieser Schleifentyp über alle Objekte eines Objekt-Containers.

Prinzipiell kann man jeden Schleifentyp in einen anderen Schleifentyp überführen.

Dein Umschreiben in eine For-Schleife stimmt nicht ganz.

  1. int pos = studentenRucksaecke.size(); // woher weisst du, wieviele Rucksäcke das sind? In der Klammer muss man die Anzahl der Rucksäcke festlegen. Genau deswegen kam von einem Fraganten der Vorschlag, eine for-each-Schleife zu verwenden!
  2. pos>=1; // Dieser Boolsche Ausdruck passt zwar hinter das While, prüft aber so nicht in der For-Schleife!
  3. pos-- // Nur dieser Teil passt in der For-Schleife.

Hier noch ein Link zum „ollen Ullenboom“: http://openbook.galileocomputing.de/javainsel/

Der kann das mit den Schleifen noch besser erklären … :-)


nintendoluk  05.02.2015, 10:59

Dein Umschreiben in eine For-Schleife stimmt nicht ganz.

  1. int pos = studentenRucksaecke.size(); // woher weisst du, wieviele Rucksäcke das sind? In der Klammer muss man die Anzahl der Rucksäcke festlegen. Genau deswegen kam von einem Fraganten der Vorschlag, eine for-each-Schleife zu verwenden!

Die Funktion ArrayList.size() benötigt keine Übergabe-Parameter, sie gibt immer die größer der ArrayList zurück.

pos>=1; // Dieser Boolsche Ausdruck passt zwar hinter das While, prüft aber so nicht in der For-Schleife!

Natürlich passt das auch in eine For-Schleife! Ich frag mich wo du diesen Schwachsinn herhast? Ich frage mich auch wie du eine For-Schleife machen würdest!

pos-- // Nur dieser Teil passt in der For-Schleife.

Wenigstens da sind wir uns einig... ^^'

Hier noch ein Link zum „ollen Ullenboom“: http://openbook.galileocomputing.de/javainsel/

Der kann das mit den Schleifen noch besser erklären … :-)

...Und vor allem richtig ...

Sorry, nichts für ungut ^^ Aber das konnte ich einfach nicht so stehen lassen. Immerhin hast du von mir aus versehen einen "Daumen Hoch" bekommen ;-P

0
nintendoluk  05.02.2015, 11:06
@nintendoluk
Wenigstens da sind wir uns einig... ^^'

Bzw. mit deinem "nur" bin ich nicht ganz einverstanden ;-)

0