Java Problem mit Array, variable Größe oder ähnliches

hahny

Ensign
Registriert
Nov. 2007
Beiträge
171
So Leute, muss euch LEIDER mit einem Problem konfrontiere was (denke ich) für erfahrene Programmierer einfach zu lösen ist...

Ich würde gerne ein Array erstellen in das ich Einträge einfügen kann für zB. Bestellungen von einzelnen Pizzas (siehe meinen Code unten) und auch wieder löschen nach dem diese geliefert wurden.

Falls noch Fragen zum Programm sind, ist für ne Schularbeit aber ich komm absolut nicht weiter bei der sache und im netz findet sich dazu wenig verständliches...


Die Problem Methoden sind "bestellen" und "ausliefern" und natürlich das Array "pizzaBst"

hoffe ihr könnt mir helfen, Danke schonmal im voraus!

Code:
public class Pizzahuette{
  //Attribute
  private double preis[][] = new double[128][2];

 //Da faengts schon an, hier Array erstellen und dann...
 private int pizzaBst[][] = new int[][2];

  private String pizzasorten[] = new String[128];
  private String name;
  private double konto;
  private double tageskasse;
  
  //Konstruktor
  public Pizzahuette(String pName){
    name = pName;
    konto = 0;
    tageskasse = 0;
    
    
    pizzasorten[0]="Margaritha";
    preis[0][0]=2.50;
    preis[0][1]=4.25;
    
    pizzasorten[1]="Funghi";
    preis[1][0]=3.50;
    preis[1][1]=4.75;
    
    pizzasorten[2]="Salami";
    preis[2][0]=3.00;
    preis[2][1]=4.75;
    
    pizzasorten[3]="Tonno";
    preis[3][0]=3.90;
    preis[3][1]=6.20;
    
    pizzasorten[4]="Diavolo";
    preis[4][0]=3.90;
    preis[4][1]=6.20;
    
    pizzasorten[5]="Bolognese";
    preis[5][0]=3.65;
    preis[5][1]=5.90;
  }
  
  //Methoden
  public void tagEnde(){
    konto=konto+tageskasse;
    tageskasse=0;
  }
 

 
  public void ausliefern(double pGeldGegeben){
  
    double gPreis = 0;
  
    for (int i = -1; i == pizzaBst.length; i++) {
      gPreis = gPreis + preis[pizzaBst[i][0]][pizzaBst[i][1]];
    }
    
    bezahlen(pGeldGegeben, gPreis);
    
    for (int i = -1; i== pizzaBst.length; i++) {
      System.out.println("Die Pizza " + pizzasorten[pizzaBst[i][0]] + " wurde ausgeliefert und bezahlt.");
    }

  }
  
  public void bestellen(int pSorte, int pGroesse){

    int laenge = pizzaBst.length;

    pizzaBst[laenge+1][0] = pSorte;
    pizzaBst[laenge+1][1] = pGroesse;
    
    System.out.println("Die Pizza " + pizzasorten[pSorte] + " wurde bestellt und kann ausgeliefert werden, Sie koennten eine weitere Pizza zu Ihrer bestellung hinzufuegen.");
  }



  
  public void bezahlen(double pBezahlt, double pKosten){
    if (pKosten>pBezahlt) {
      System.out.println("Sie haben zu wenig Geld gegeben.");
    } else {
      double restgeld=pBezahlt-pKosten;
      System.out.println("Der Kunde bekommt " + restgeld + " Euro zurueck.");
      tageskasse = tageskasse + pKosten;
    }


  }
  
  public void neuePizzasorte(String pName, double pPreisGross, double pPreisKlein){
    int laenge=pizzasorten.length;
    pizzasorten[laenge+1]=pName;
    preis[laenge+1][0]=pPreisKlein;
    preis[laenge+1][1]=pPreisGross;
    
    System.out.println("Die Pizzasorte " + pizzasorten[pizzasorten.length] + " mit demPreis " + preis[pizzasorten.length][0] + " Euro fuer kleine und " + preis[pizzasorten.length] + " Euro fuer grosse Pizzen wurde hinzugefuegt.\n");
  }


// Nur zum Test, wollte nur die beiden Werte ausgeben lassen...
  
  public void getWerteAusgeben(){
    System.out.println("Tageskasse - Betrag: " + tageskasse + " Euro");
    System.out.println("Kontostand: " + konto + " Euro");
  }
}
 
Hab das jetzt mal nur kurz überflogen und daher nur nen kleinen Tipp:

Also du hast ne Klasse PizzaHuette, welche Pizzen verkauft! Dann wäre es doch sinnvoll auch eine Klasse Pizza zu haben...

Bsp.:

PHP:
class Pizza{

    private String name;
    private double preis;

    // usw.

}


In deiner PizzaHuette-Klasse legst du dann einfach eine ArrayList wie folgt an

PHP:
List<Pizza> pizzaListe = new ArrayList<Pizza>();

So, jetzt kannst du dir nochmal paar Gedanken dazu machen...
 
Also das hört sich schonmal nicht schlecht an, werde denke ich eine ähnlcihe Lösung umsetzen müssen.

Ich würde aber lieber bei einer Klasse bleiben, einfach weil ichs jetz so angefangen habe und das auch gerne so amchen würde (vllt. weil ich bockig/sturr bin ^^)

also ich habe mich jetzt mal mit java.util.vector auseinandergesetzt und hab gesehen das man dort nur einschichtige Listen/arrays erstellen kann, da ich ja ein 2-schichtiges verwenden möchte geht das auch nicht - das ist doof

werde jetzt mal ein wenig nach ArrayList sehen, vllt. kann ich mir ja da was "basteln"

und danke schonmal für den Ansatz

Edit: So ich glaube ich rall mal so ziemlich NIX, weder aus der API Documentation von Sun als auch aus dem Buch "JavaInsel", könnte mir das mal jemand erklären, bin ratlos T_T
 
Zuletzt bearbeitet:
Was genau willst du erklärt haben? Und warum willst du unbedingt ein zweidimensionales Array verwenden?

http://openbook.galileocomputing.de...12_001.htm#mj56473f9ef96ebf07a99f30f1dd64f7df

Das solltest du schon mal auf jeden Fall lesen. Und überlege dir bitte nochmal deinen Entwurf! Du willst ja objektorientiert programmieren, von daher ist es doch nur logisch eine Klasse Pizza zu verwenden. Überleg dir mal, wie man das ganze mit so einer extra-Klasse umsetzen könnte. Und gib nich schon nach ner halben Stunde lesen auf.

Glaub mir, wenn du das rausfaktorisierst, machst du dir das Leben echt einfacher.
 
Ich programmier grad einfach mal deinen Vorschlag so aus, dass ich sagen kann cih hab mein bestes getan. Das mit dem Lesen ist so eine Sache... das geht auch nach nem Kaffee wieder :)

Also die ArrayList kann jetzt "nur" Objekte der Klasse Pizza auflisten, oder? und über die entsprechenden Einträge kann cih darauf zugreifen also die erste Pizza wäre dann
pizzaListe(0)
oder irre ich mich, bitte verbesser mich da falls ich falsch liege.

Wie könnte ich denn nun die komplette ArrayList leeren, sodass ich dann nach einer Auslieferung wieder "von Vorne" anfangen könnte aufzulisten?

EDIT: so weit bin ich schoneinmal, jetz wird mir aber im JavaEditor der Fehler:

"cannot find Symbol" für die class List und die class ArrayList ausgeworfen...

PHP:
public class Pizzahuette{
  //Attribute
  private double preis[][] = new double[128][2];
  private String pizzasorten[] = new String[128];
  private String name;
  private double konto;
  private double tageskasse;
  List<Pizza> pizzaListe = new ArrayList<Pizza>();

  
  //Konstruktor
  public Pizzahuette(String pName){
    name = pName;
    konto = 0;
    tageskasse = 0;
    
    
    pizzasorten[0]="Margaritha";
    preis[0][0]=2.50;
    preis[0][1]=4.25;
    
    pizzasorten[1]="Funghi";
    preis[1][0]=3.50;
    preis[1][1]=4.75;
    
    pizzasorten[2]="Salami";
    preis[2][0]=3.00;
    preis[2][1]=4.75;
    
    pizzasorten[3]="Tonno";
    preis[3][0]=3.90;
    preis[3][1]=6.20;
    
    pizzasorten[4]="Diavolo";
    preis[4][0]=3.90;
    preis[4][1]=6.20;
    
    pizzasorten[5]="Bolognese";
    preis[5][0]=3.65;
    preis[5][1]=5.90;
  }
  
  //Methoden
  public void tagEnde(){
    konto=konto+tageskasse;
    tageskasse=0;
  }
  
  public void ausliefern(double pGeldGegeben){
  
    double gPreis = 0;
  
    for (int i = -1; i == pizzaListe.size(); i++) {
      Pizza Obj0 = pizzaListe.get(i);
      gPreis = gPreis + Obj0.getPreis();
    }
    
    //Zum testen eingebaut
    System.out.println(gPreis);
    
    bezahlen(pGeldGegeben, gPreis);
    
    for (int i = -1; i == pizzaListe.size(); i++) {
      Pizza Obj1 = pizzaListe.get(i);
      System.out.println("Die Pizza " + Obj1.getName() + " wurde ausgeliefert und bezahlt.");
    }
    
    

  }
  
  public void bestellen(int pSorte, int pGroesse){
  
    String name = pizzasorten[pSorte];
    double preis = preis[pSorte][pGroesse];
  
    pizzaListe.add = new Pizza(name, preis);

    
    System.out.println("Die Pizza " + pizzasorten[pSorte] + " wurde bestellt und kann ausgeliefert werden, Sie koennten eine weitere Pizza zu Ihrer bestellung hinzufuegen.\n");
  }
  
  public void bezahlen(double pBezahlt, double pKosten){
    if (pKosten>pBezahlt) {
      System.out.println("Sie haben zu wenig Geld gegeben.\n");
    } else {
      double restgeld = pBezahlt-pKosten;
      System.out.println("Der Kunde bekommt " + restgeld + " Euro zurueck.\n");
      tageskasse = tageskasse + pKosten;
    }


  }
  
  public void neuePizzasorte(String pName, double pPreisGross, double pPreisKlein){
    int laenge=pizzasorten.length;
    pizzasorten[laenge+1]=pName;
    preis[laenge+1][0]=pPreisKlein;
    preis[laenge+1][1]=pPreisGross;
    
    System.out.println("Die Pizzasorte " + pizzasorten[pizzasorten.length] + " mit demPreis " + preis[pizzasorten.length][0] + " Euro fuer kleine und " + preis[pizzasorten.length] + " Euro fuer grosse Pizzen wurde hinzugefuegt.\n");
  }
  
  public void getWerteAusgeben(){
    System.out.println("Tageskasse - Betrag: " + tageskasse + " Euro");
    System.out.println("Kontostand: " + konto + " Euro");
    System.out.println("________________________\n");
  }
}

PHP:
public class Pizza{
  //Attribute
  private String name;
  private double preis;
  
  //Konstruktor
  public Pizza(String pName, double pPreis){
  
  name = pName;
  preis = pPreis;

  }
  
  public double getPreis(){
    return preis;
  }
  
  public String getName(){
    return name;
  }


}

PHP:
public class PizzahuettenVerwaltung{
  public static void main(String[] args){
    Pizzahuette ph01 = new Pizzahuette("The Pizzahuette");
    
    ph01.bestellen(0, 1);
    ph01.bestellen(2, 1);
    ph01.bestellen(3, 0);
    ph01.bestellen(3, 1);
    
    ph01.ausliefern(20.00);

    ph01.getWerteAusgeben();
  }
}
 
Zuletzt bearbeitet:
Du musst auch erst importieren oder die absoluten Namen verwenden.. also import java.util.ArrayList; und so weiter.

Was soll der zweite Preis bei den Pizzen immer, ist das mit extra Zutaten oder so? für MwSt. sind die Beträge etwas hoch ;)

ArrayList.clear(); und alles ist weg. ArrayList.remove(int x); zum einzelne Einträge entfernen.
 
Die Preise sollen jew für große preis[...][1] oder halt kleine Pizzen preis[...][0] sein

das mit dem importieren hört sich auch mal echt sinnvoll an, will aber nicht so wie ich will >.<
gehen müsste doch auch
import java.util.*;

Edit: ich bin einfach nur zu doof dazu, sollte auch importieren BEVOR ich mit der Klasse beginne...

Den einzigen Fehler den er jetzt noch auswirft ist:


Pizzahuette.java:77:25: array required, but double found
double preis = preis[pSorte][pGroesse];
______________ ^



muss ich doch einfach den zwischen wert double preis anders nennen dann läufts warscheilich ^^
 
Zuletzt bearbeitet:
import java.util.ArrayList; funktioniert bestens.

Ich vermute eher ein Problem dabei, WIE du die ArrayList benutzt. Aber du musst schon etwas code oder den Fehler liefern.

edit: Warum verwendest du überhaupt noch das Array, wenn du die ArrayList benutzt jetzt? Entweder oder!
Befülle deine ArrayList mit Instanzen vom Typ Pizza und gut ist, sehe momentan dein Problem nicht.
 
Zuletzt bearbeitet:
So, also es gibt keinerlei Fehlermeldungen von Java mehr, das ist schonmal gut

jetz hab ich aber das Problem, dass die preise nicht oder extrem fehlerhaft berechnet werden, denn die Ausgabe ist und bleibt die ganze ziet über 0 wenn ich die Methode ausliefern verwende

könnte es sein das mein Fehler etwa in der Methode bestellen liegt oder direkt bei ausliefern

PHP:
  public void ausliefern(double pGeldGegeben){
  
    double gPreis = 0;
  
    for (int i = -1; i == pizzaListe.size(); i++) {
      Pizza Obj0 = pizzaListe.get(i);
      gPreis = gPreis + Obj0.getPreis();
    }
    
    //Zum testen eingebaut
    System.out.println(gPreis);
    
    bezahlen(pGeldGegeben, gPreis);
    
    for (int i = -1; i == pizzaListe.size(); i++) {
      Pizza Obj1 = pizzaListe.get(i);
      System.out.println("Die Pizza " + Obj1.getName() + " wurde ausgeliefert und bezahlt.");
    }
    
    pizzaListe.clear();

  }
  
  public void bestellen(int pSorte, int pGroesse){
  
    String name = pizzasorten[pSorte];
    double preis0 = preis[pSorte][pGroesse];
  
    pizzaListe.add(new Pizza(name, preis0));

    System.out.println("Die Pizza " + pizzasorten[pSorte] + " wurde bestellt und kann ausgeliefert werden, Sie koennten eine weitere Pizza zu Ihrer bestellung hinzufuegen.\n");
  }

und nochmal dickes DANKE, das man um diese uhrzeit noch so gut Hilfe bekommt hätte ich nicht gedacht ^^

Edit: könnte doch auch beim aufruf der Methode bezahlen was falsch sein oder? wenn ich zB Pizzahuette.bezahlen(...) eingebe hab cih wieder eine Fehlermeldung

PHP:
  public void bezahlen(double pBezahlt, double pKosten){
    if (pKosten>pBezahlt) {
      System.out.println("Sie haben zu wenig Geld gegeben.\n");
    } else {
      double restgeld = pBezahlt-pKosten;
      System.out.println("Der Kunde bekommt " + restgeld + " Euro zurueck.\n");
      tageskasse = tageskasse + pKosten;
    }


  }
 
Zuletzt bearbeitet:
Du musst dir eine Grundsatzfrage stellen. Normalerweise erstellt man für jede Pizza eine eigene Klasse, abgeleitet von einer (evt. abstrakten) Pizzaklasse. Die Attribute wie Preis etc. sind doch immer da, nicht erst bei deiner Bestellung wie du es machst. Wenn die Pizza niemals bestellt wird, so ist es doch immernoch ein Gegenstand, der einen Preis besizt und einen Namen hat. Dann kannst du dir auch das blöde Array mit dem Namen und Preis sparen. Genau diese 2 Dinge machen eine Pizza doch gerade aus, und zwar nicht erst bei der Bestellung.
Deine ArrayList vom Typ Pizza schluckt dann trotzdem alle Arten von Pizzen.

Was machst du übrigens, wenn bei der Bestellung eine sorte angegeben wird, die es nicht gibt?


edit: Warum iterierst du eigentlich ab -1 durch deine List? Wundert mich, dass das überhaupt geht.
 
Zuletzt bearbeitet:
Gut mir ist wohl der nächste fehler aufgefallen, es gibt in Java nur "solange"-Bedingungen, daher würde i == pizzaListe.size() keinen Sinn machen

Und ob das in der OOP Sinn macht es so zu schreiben wie ich es tu sei mal dahin gestellt, ich mache das wie gesagt für die Schule und bin schon dabei einiges an Sachen zu verändern die mein ehrenwerter Herr Lehrer (brenn in der Hölle!) schon abgesegnet hat, bitte nicht böse sein

und die For-Schleifen funktionieren seit meiner veränderung auhc nicht mehr, geben immer eine Fehlermeldung aus:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: -1
at java.util.ArrayList.get(ArrayList.java:324)
at Pizzahuette.ausliefern(Pizzahuette.java:57)
at PizzahuettenVerwaltung.main(PizzahuettenVerwaltung.java:9)


PHP:
public class PizzahuettenVerwaltung{
  public static void main(String[] args){
    Pizzahuette ph01 = new Pizzahuette("The Pizzahuette");
    
    ph01.bestellen(0, 1);
    ph01.bestellen(2, 1);
    ph01.bestellen(3, 0);
    
    ph01.ausliefern(20.00);

    ph01.getWerteAusgeben();
    
    ph01.tagEnde();
    
    ph01.neuePizzasorte("Speciale", 8.50, 6.50);
    ph01.neuePizzasorte("Diavolo Speciale", 10.00, 8.00);
    ph01.bestellen(6, 1);
    ph01.ausliefern(15.00);
    
    ph01.getWerteAusgeben();
  }
}

PHP:
import java.util.*;

public class Pizzahuette{
  //Attribute
  private double preis[][] = new double[128][2];
  private String pizzasorten[] = new String[128];
  private String name;
  private double konto;
  private double tageskasse;
  private int laengeKarte = 5;
  List<Pizza> pizzaListe = new ArrayList<Pizza>();

  
  //Konstruktor
  public Pizzahuette(String pName){
    name = pName;
    konto = 0;
    tageskasse = 0;
    
    pizzasorten[0]="Margaritha";
    preis[0][0]=2.50;
    preis[0][1]=4.25;
    
    pizzasorten[1]="Funghi";
    preis[1][0]=3.50;
    preis[1][1]=4.75;
    
    pizzasorten[2]="Salami";
    preis[2][0]=3.00;
    preis[2][1]=4.75;
    
    pizzasorten[3]="Tonno";
    preis[3][0]=3.90;
    preis[3][1]=6.20;
    
    pizzasorten[4]="Diavolo";
    preis[4][0]=3.90;
    preis[4][1]=6.20;
    
    pizzasorten[5]="Bolognese";
    preis[5][0]=3.65;
    preis[5][1]=5.90;
  }
  
  //Methoden
  public void tagEnde(){
    konto = konto + tageskasse;
    tageskasse = 0;
  }
  
  public void ausliefern(double pGeldGegeben){
  
    double gPreis = 0;
    int listenLaenge = pizzaListe.size();
  
    for (int i = -1; i <= listenLaenge; i++) {
      Pizza Obj0 = pizzaListe.get(i);
      gPreis = gPreis + Obj0.getPreis();
    }
    
    //Zum testen eingebaut
    System.out.println(gPreis);
    
    bezahlen(pGeldGegeben, gPreis);
    
    for (int i = -1; i <= listenLaenge; i++) {
      Pizza Obj1 = pizzaListe.get(i);
      System.out.println("Die Pizza " + Obj1.getName() + " wurde ausgeliefert und bezahlt.");
    }
    
    pizzaListe.clear();

  }
  
  public void bestellen(int pSorte, int pGroesse){
  
    String name = pizzasorten[pSorte];
    double preis0 = preis[pSorte][pGroesse];
  
    pizzaListe.add(new Pizza(name, preis0));

    System.out.println("Die Pizza " + pizzasorten[pSorte] + " wurde bestellt und kann ausgeliefert werden, Sie koennten eine weitere Pizza zu Ihrer bestellung hinzufuegen.\n");
  }
  
  public void bezahlen(double pBezahlt, double pKosten){
    if (pKosten>pBezahlt) {
      System.out.println("Sie haben zu wenig Geld gegeben.\n");
    } else {
      double restgeld = pBezahlt - pKosten;
      System.out.println("Der Kunde bekommt " + restgeld + " Euro zurueck.\n");
      tageskasse = tageskasse + pKosten;
    }

  }
  
  public void neuePizzasorte(String pName, double pPreisGross, double pPreisKlein){
    
    pizzasorten[laengeKarte+1]=pName;
    preis[laengeKarte+1][0]=pPreisKlein;
    preis[laengeKarte+1][1]=pPreisGross;
    
    System.out.println("Die Pizzasorte " + pizzasorten[laengeKarte+1] + " mit demPreis " + preis[laengeKarte+1][0] + " Euro fuer kleine und " + preis[laengeKarte+1][1] + " Euro fuer grosse Pizzen wurde hinzugefuegt.\n");

    laengeKarte = laengeKarte + 1;
  }
  
  public void getWerteAusgeben(){
    System.out.println("Tageskasse - Betrag: " + tageskasse + " Euro");
    System.out.println("Kontostand: " + konto + " Euro");
    System.out.println("________________________\n");
  }
}
Ergänzung ()

hat sich mitlerweile erledigt, falls Interesse besteht kann cih auch meine "finale" Lösung hier posten.

Danke nochmals für die Hilfe und gute Nacht bzw. guten Morgen noch :D
 
Ich hoffe, du hast die For-Schleife durch diese Syntax ersetzt:
Code:
for (Pizza pizza : pizzaListe) {
    gPreis = gPreis + pizza.getPreis();
}
 
Zuletzt bearbeitet:
eeehm also das von SheepShaver check ich schonmal nicht, aber brauch ich ja auch nicht, mitlerweile klappt das ja soweit ganz gut;

frage mich auch was das bringen sollte...
 
Weil deine Schleife, so wie sie jetzt da steht, absolut grütze ist. Des Weiteren hast du meinen Vorschlag scheinbar mit deinem Ansatz vermischt. Wie schon erwähnt, mach dir nochmals Gedanken über deinen Entwurf, d.h. mach OOA. Auch wenn deine jetzige Version läuft, denn du willst ja lernen, vernünftigen Code zu schreiben
 
Zuletzt bearbeitet:
Die for-Schleife über pizzaListe ist so, wie sie da steht, zwar Grütze, aber nicht wegen der Schreibweise, sondern weil du am Index -1 anfängst. Eine List ist aber 0-basiert. Das i++ im dritten Schleifenteil wird nach jedem Schleifendurchlauf ausgeführt, nicht vorher.

Klar kann man die "neue" Version der for-Schleife verwenden (sofern man mit mindestens J2SE 5 arbeitet), aber es gibt durchaus Situationen, in denen die Nutzung dieser Schleife nicht hilft, sondern hinderlich ist. Dann muss man auch die "alte" Version der Schleife beherrschen. Daher sind Anfänger besser beraten, wenn sie zunächst ausschließlich diese benutzen.
 
Foreach in Java hat einige Eigenheiten, teilweise nur in Java so, teilweise generell so bei foreach:

- Man kann nur lesend auf das zu iterierende Array/List etc. zugreifen, bzw. Zuweisungen sind technisch möglich aber ohne Effekt
- Man kann nur mit einem Array/List whatever arbeiten, keine 2 Arrays vergleichen oder so (Laufindex fehlt)
- Es geht zwingend vom ersten zum letzen Element, Reihenfolge nicht beeinflussbar

Desweiteren nutzt diese Variante Autoboxing, weshalb sie primär nur für Listen etc. zu gebrauchen ist, da man bei Listen ja eh schon bei den eigentlich skalaren Typen Boxing machen muss um sie dort überhaupt reinzubekommen. Für Arrays also nicht zu empfehlen, wenn dort direkt die skalaren Typen ohne Boxing drinstecken, sonst muss bei jedem Durchlauf schön Autoboxing betrieben werden. Wenn also Arrays und skalare Typen im Spiel sind und man nicht boxen möchte, dann lässt man von vornherein besser gleich die finger von foreach und nutzt lieber for.


Bin schon lange kein Fan mehr von "Foreach" in Java.
 
Zuletzt bearbeitet:
Die genannten Statements würde ich gern nochmals diskutieren:

carom schrieb:
- Man kann nur lesend auf das zu iterierende Array/List etc. zugreifen, bzw. Zuweisungen sind technisch möglich aber ohne Effekt
Das hat auch mehrere gute Gründe, warum das so implementiert ist. Es ist sowohl
  • performanter, wenn man nicht bei jedem Durchlauf prüfen muss, ob sich die Liste geändert hat
  • transparenter, weil es direkt auf einen Iterator umgesetzt wird (sieht man, wenn man den Code in der JVM debuggt oder per JAD backcompiliert)
  • sehr schlechter Stil und hochgradid fehleranfällig, die Liste während der Iteration zu modifizieren. Das sollte zweiphasig erledigt werden.

carom schrieb:
- Man kann nur mit einem Array/List whatever arbeiten, keine 2 Arrays vergleichen oder so (Laufindex fehlt)
Stimmt soweit. Ist in meinen Augen aber nicht wirklich ein Nachteil. Dafür ist eine Schleife über einer Container-Struktur halt nicht gedacht.

carom schrieb:
- Es geht zwingend vom ersten zum letzen Element, Reihenfolge nicht beeinflussbar
Richtig gedacht, falsch formuliert. Stimmt bei nicht-ordnungserhaltenden Strukturen (wie HashMaps) nicht.

Der Punkt mit dem Autoboxing geht meiner Meinung nach etwas weit am Thema vorbei. Bei bekannter Anzahl an Elementen, nimmt man sowieso low-level Arrays. Wenn die Elementzahl nicht bekannt ist, muss ich für primitive Datentypen sowieso beim Einfügen und Rauslesen boxen - das hat gar nichts mit der Schleife zu tun.

Ansonsten gibt es noch zwei gute Argumente, warum man in dem aufgeführten Beispiel nicht per Indexzugriff iterieren sollte:
  • indizierter Zugriff auf einer List ist extra-grützig und haut auf die Laufzeit, wenn dort etwas anderes als eine ArrayList hängt (wer jetzt meint, dass man ja weiß, dass es eine ArrayList ist - setzen 6, und nochmal über OO nachdenken ;) )
  • foreach wird wie oben erläutert im Hintergrund über Iteratoren gehandlet - und die sind schneller als indizierter Zugriff (solange es nicht um low-level Arrays geht, bei denen bin ich mir spontan nicht sicher)

Schlussendlich macht Foreach meiner Meinung nach den Code sehr viel eleganter und auch kürzer - die genannten Faktoren muss man natürlich berücksichtigen.
 
Zuletzt bearbeitet:

Ähnliche Themen

Zurück
Oben