# Java lernen mit BlueJ Aufgabe 4.26



## ToBe4minimal (19. Mai 2010)

Hallo,

ich gehe gerade komplett nach und nach das oben genannte Buch durch und habe eine Frage zur oben genannten Aufgabe.

In dieser Aufgabe soll eine Methode beenden() geschrieben werden.
In den Lösungen die ich habe, wird diese Aufgabe mit einer for-each Schleife realisiert.

Ich persönlich jedoch möchte es auch mit anderen Schleifen versuchen, hänge aber schon ewig an einem Problem, dass ich scheinbar generell noch nicht richtig verstanden habe.

Der Code der Lösung ist folgender:


```
public void beenden()
    { 
        for(Posten posten : postenliste) 
        {
            System.out.println(posten.gibNummer() + ": " + posten.gibBeschreibung()); 
            // Enthält sämtliche Details eines Höchstgebots. 
            Gebot hoechstesGebot = posten.gibHoechstesGebot(); 
            if(hoechstesGebot != null) 
            { 
                System.out.println(" Höchstbietender: " + hoechstesGebot.gibBieter().gibName()); 
                System.out.println(" Gebot: " + hoechstesGebot.gibHoehe()); 
            } 
            else 
            { 
                System.out.println(" Unverkauft"); 
            } 
        }
    }
```


Ich möchte jetzt die gleiche Methode mit einer while Schleife realisieren.
Problem: Die externen Methodenaufrufe die dort benutzt wurden sind so nicht möglich, da die Variable posten deklariert werden muss. Ich weiß aber einfach nicht wie.

Kurz gesagt, ich verstehe die externen Methodenaufrufe noch nicht so ganz, auch wenn ich weiß das man diese als Objektname.Methodenname(Parameter) aufbaut, so wie in diesem Fall zum Beispiel posten.gibNummer().

In der for each Schleife wird in der Bedingung oben ja mit (Posten posten : postenliste) ja die Variable posten deklariert, deswegen dort keine Fehlermeldung.

In der while Schleife ist die Bedingung aber ja anders.

Man würde anfangen mit:

int index = 0;
while (index < postenliste.size())
{
usw.


Ich habe also absolut noch Probleme damit, zu wissen welchen Objektnamen ich benutzen muss bei den externen Methodenaufrufen.

Hoffe ihr könnt mir helfen, sitz jetzt ewig dran, kriege es aber einfach nicht heraus.


LG
Tobi


----------



## Creativ (19. Mai 2010)

Wenn ich das jetzt richtig verstanden habe, kannst du dir ja in der while-Schleife die Variable posten selber anlegen:


```
int index = 0;
while (index < postenliste.size())
{
Posten posten = postenliste.get(index);
// das andere zeug
index++;
}
```


----------



## ToBe4minimal (19. Mai 2010)

Mit Posten posten = ... habe ich auch angefangen, wusste aber dann nicht mehr weiter.

Also wenn ich das jetzt richtig verstanden habe, deklariert man sich einfach die variablen, die man dann beim externen Methodenaufruf als Objektnamen benutzt einfach selbst??

Jedenfalls, sofern die Variable nicht bereits in der Klasse deklariert wurde??


----------



## ToBe4minimal (19. Mai 2010)

Also tatsächlich, es funktioniert!!!

Glaubt ihr mir, es war diese eine kleine Sache, dass ich nicht wusste wie ich die Variable posten initialisieren soll??!!!

postenliste.get(index)

DAS WARS!!!

Danke!!


----------



## gman (19. Mai 2010)

> deklariert man sich einfach die variablen, die man dann beim externen Methodenaufruf als Objektnamen benutzt einfach selbst??



Naja, nicht so ganz. Du hast ja die Liste "postenliste". Mit der foreach-Schleife wird automatisch
bei jedem Schleifendurchlauf deine Variable "posten" mit einem Objekt vom Typ "Posten" gefüllt.

Wenn du das jetzt mit einer while-Schleife umsetzen willst, so musst du eben genau dies selber 
machen, mit:


```
Posten posten = postenliste.get(index);
```

holst du aus der Liste das Objekt was du gerade bearbeiten willst. Und damit du nicht immer das
selbe Objekt hast zählst du am Ende der Schleife die Variable "index" hoch.

Ich hoffe, dadurch wird es noch etwas deutlicher.


----------



## ToBe4minimal (19. Mai 2010)

gman hat gesagt.:


> Naja, nicht so ganz. Du hast ja die Liste "postenliste". Mit der foreach-Schleife wird automatisch
> bei jedem Schleifendurchlauf deine Variable "posten" mit einem Objekt vom Typ "Posten" gefüllt.
> 
> Wenn du das jetzt mit einer while-Schleife umsetzen willst, so musst du eben genau dies selber
> ...




Hey,

ja danke!!

Auf jeden Fall etwas...
Das war das, was ich noch nicht so ganz verstanden habe.


----------



## Gastredner (20. Mai 2010)

Noch ein kleiner Hinweis am Rande: Du hast keine reine for-Schleife, sondern die erweiterte-for- bzw. foreach-Schleife verwendet. Die normale for-Schleife nutzt eine (oder mehrere) Zählvariable und ändert diese im Lauf:

```
for (int i=0; i<postenliste.size(); i++) {
Posten posten = postenliste.get(i);
// ...
}
```


----------



## Swoop (25. Mai 2010)

außerdem wäre es vllt ganz sinnvol posten außerhalb zu erzeugen damit nicht immer wieder ein neues Objekt erzeugt wird sondern das alte überschrieben wird...


```
Posten posten;
for (int i=0; i<postenliste.size(); i++) {
posten = postenliste.get(i);
// ...
}
```


----------



## maki (25. Mai 2010)

Swoop hat gesagt.:


> außerdem wäre es vllt ganz sinnvol posten außerhalb zu erzeugen damit nicht immer wieder ein neues Objekt erzeugt wird sondern das alte überschrieben wird...
> 
> 
> ```
> ...


Nein wäre nicht sinnvoll, es wird auch so kein neues Objekt erzeugt.


----------



## badzooaka (11. Feb 2016)

Hey
um elemente einer Sammlung zu iritieren brauchst entweder die for each schleife(type variable:Sammlung) oder eine while schleife mit einem Iterator.
du kannst so machen:
Iterator<Posten> it= Posten.iterator();
while(it.hasNext())
{ it.next();
System.out.println(posten.gibNummer()+": "+ posten.gibBeschreibung());
           // Enthält sämtliche Details eines Höchstgebots. 
            Gebot hoechstesGebot = posten.gibHoechstesGebot();
           if(hoechstesGebot !=null)
           {
System.out.println(" Höchstbietender: "+ hoechstesGebot.gibBieter().gibName());
System.out.println(" Gebot: "+ hoechstesGebot.gibHoehe());
           }
           else
           {
System.out.println(" Unverkauft");
           }
}


----------



## Tarrew (11. Feb 2016)

Ich glaube der TE wird das nicht mehr lesen  
Der Thread ist fast 6 Jahre alt!


----------

