Du bist nicht angemeldet.

Stilllegung des Forums
Das Forum wurde am 05.06.2023 nach über 20 Jahren stillgelegt (weitere Informationen und ein kleiner Rückblick).
Registrierungen, Anmeldungen und Postings sind nicht mehr möglich. Öffentliche Inhalte sind weiterhin zugänglich.
Das Team von spieleprogrammierer.de bedankt sich bei der Community für die vielen schönen Jahre.
Wenn du eine deutschsprachige Spieleentwickler-Community suchst, schau doch mal im Discord und auf ZFX vorbei!

Werbeanzeige

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

1

09.12.2010, 18:09

Vorteile des (List)Iterator [Java]

Hi zusammen,

Stehe seit heute vor folgendem Problem.
Ich erkenne derzeit nicht wirklich den Sinn eines Iterators. Es geht hierbei um eine Klasse Einkaufszettel, die eine LinkedList shoppingList mit Objekten der Klasse Article beeinhaltet. Der folgende Quelltext zeigt die toString() Methode der Klasse Einkaufszettel.

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
public String toString()
{
ListIterator<Article> it = shoppingList.listIterator();
String s = "Einkaufsliste\n"; 

while(it.hasNext())
{
Article that = it.next();
s += that.getName() +
   "\nPrice: " + that.getPrice()+ 
   "\nAmount: " + that.getAmount() + "\n\n";
}

return s;
}


Äquivalent dazu lässt sich doch auch einfach schreiben

C#-Quelltext

1
2
3
4
5
6
7
8
9
10
11
12
13
14
public String toString()
{
String s = "Einkaufsliste\n";

for(int i = 0; i<shoppingList.size(); i++)
{
Article that = shoppingList.get(i);
s += that.getName() +
       "\nPrice: " + that.getPrice()+ 
       "\nAmount: " + that.getAmount() + "\n\n";
}

return s;
}


Jetzt verstehe ich nicht so ganz warum ich mir die Mühe machen soll überhaupt einen Iterator zu benutzen wenn es doch auch so einfach geht?
Hoffe ihr könnt mir helfen =)
lg
Sc4v

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

2

09.12.2010, 18:30

Ganz einfach. Abstraktion.

Ok, vielleicht ein wenig ausführlicher. Das Konzept der Iteratoren ist dazu da, um eine Abstraktion von etwas, dass auf ein Objekt, welches sich in einem Container befindet zu haben.

Bei deinem Beispiel könnte es z.B sein, dass du irgendwann vielleicht einen anderen Container benutzen möchtest und halt gewisse Funktionen nicht vorhanden sind und dann musst du keinen Code umschreiben, sondern kannst mit ein paar kleinen Änderungen das bewerkstelligen. Ansonsten musst du möglicherweise deinen Code an vielen Stellen anpassen gehen.

Probier bei dir doch einfach mal den die Liste, die hinter shoppingList steht mit z.B einem Array zu ersetzen.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

3

09.12.2010, 18:42

okay das leuchtet mir ein wenig ein aber der wahre Vorteil einer solchen Abstraktion wird mir wohl erst bei fortgefahrener Programmierung und bei größeren Programmen bewusst.
Ich versteh nicht so ganz was du mit dem Array meinst. Sicherlich lässt sich die ShoppingList mit einem Array realisieren, aber Arrays besitzen auch keinen Iterator (oder etwa doch?).
Unter den verschiedenen Collections kann ich mir den Sinn der Iteratoren dank deiner Erklärung noch eher denken
lg

drakon

Supermoderator

Beiträge: 6 513

Wohnort: Schweiz

Beruf: Entrepreneur

  • Private Nachricht senden

4

09.12.2010, 18:56

Ein natives Array ist wahrscheinlich ein wenig ein blödes Beispiel. Andere Collections sind da bestimmt besser geeignet.
Und den grossen Vorteil wirst du schon erst ein wenig später merken. Am Anfang ist das ein wenig gewöhnungsbedürftig.

5

09.12.2010, 20:32

also so wie ich das sehe entpricht eine LinkedList ungefähr einer std::list und keinem std::vector. Mit anderen Worten: ein Zugriff per get() ist sehr langsam, da er die gesamte Liste von vorne durchlaufen muss, während es mit einem Iterator in diesem Fall schneller geht.

flux

Treue Seele

  • Private Nachricht senden

6

09.12.2010, 23:47

Alternativ:

C-/C++-Quelltext

1
2
3
4
5
6
for(Article that : shoppingList)
{
       s += that.getName() +
       "\nPrice: " + that.getPrice()+ 
       "\nAmount: " + that.getAmount() + "\n\n";
}


Vorteil von einem Iterator ist auch, dass man beim Iterieren ein Element löschen kann.
Bei den anderen Varianten gibt's 'ne ConcurrentModificationException bzw. ArrayIndexOutOfBoundsException.

Sc4v

Alter Hase

  • »Sc4v« ist der Autor dieses Themas

Beiträge: 376

Beruf: Student

  • Private Nachricht senden

7

10.12.2010, 14:26

Hi,
alles klar ich danke euch!
Ich fand den Umweg über den Iterator halt nicht sinnvoll, da er nur mehr Schreibaufwand und komplizierteren Code hervor zu bringen scheinte.
Da er aber anscheinend Vorteile hat, werde ich mich wohl dran gewöhnen müssen.

lg

Werbeanzeige