tutorials.de Buch-Aktion 05/2012
Seite 1 von 3 123 LetzteLetzte
ERLEDIGT
JA
ANTWORTEN
34
ZUGRIFFE
880
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Hallo,

    folgender Code:

    Code :
    1
    2
    3
    4
    5
    6
    7
    8
    9
    
    ArrayList<String> StringList = new ArrayList<String>();
        StringList.add("N");
        StringList.add("I");
        StringList.add("T");
        StringList.add("I");
        
        for(String str : StringList){
            System.out.println(str);
        }

    Ausgegeben wird aber:

    Code :
    1
    2
    3
    4
    5
    
    N
    I
    T
    I
    N

    Kann mir jemand sagen wieso er die Schleife 5 mal durchläuft bzw. das 1erste (nullte --> [0]) Index-Element am Ende nochmal ausgibt?

    LG,

    Lisa
     

  2. #2
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Das sehe ich aber anderst:

    Code :
    1
    2
    3
    4
    
    N
    I
    T
    I

    Zeig mal die komplette Methode.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  3. #3
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    Hallo!

    Zuallererst bitte ich dich darum Java statt Code Tags zu benutzen.

    Zu deinem Beispiel:

    Der gepostete Code funktioniert einwandfrei.


    Btw:

    Um andere Collections wie Verlinkte Listen, Sets usw. zu durchlaufen solltest du einen Iterator benutzen.
    Weiters ist es üblich Variablennamen mit einem kleinen Buchstaben beginnen zu lassen, statt einem großen.

    mfg
    Martin
    Geändert von mccae (26.03.10 um 18:56 Uhr)
     

  4. #4
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Hey,

    ja, habe den Fehler entdeckt. Entschuldigt.

    Kannst du mir ein Beispiel geben für so einen Iterator?
    Okay, das merk ich mir. Das wäre dann also stringList statt StringList?

    Dankeschön!!

    LG,

    Lisa
     

  5. #5
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Jep zu beidem.

    Code java:
    1
    2
    3
    4
    
    List<String> stringList = new ArrayList<String>(); //Weg mit unnötigen Methoden
    Iterator<String> iterator = stringList.iterator();
    while(iterator.hasNext())
        System.out.println(iterator.next());
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  6. #6
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Dankeschön.

    Also.. werde es gleich selbst probieren mit dem Iterator, aber habe die Vermutung, dass er immer mit hasNext prüft, ob weitere Elemente enthalten sind in der ArrayList und wenn nicht, endet die Schleife, oder?

    Wo verwendet man denn üblicherweise sonst so die erweiterte For-Schleife?
     

  7. #7
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    Hallo!

    Ich hab mich vorhin etwas verschrieben...

    Soweit ich weiß, ist der Zugriff bei einer ArrayList über den Index (mit for loop) viel schneller als mit einem Iterator.
    Anders sieht es zum Beispiel bei einer LinkedList aus...

    ...dass er immer mit hasNext prüft, ob weitere Elemente enthalten sind in der ArrayList und wenn nicht, endet die Schleife, oder?
    Ja, hasNext() liefert false sobald alle Elemente durchlaufen sind, und die Schleife endet.

    Bitte beachte, dass der Aufruf von next() nach rückgabe des Elements den Zeiger unwiederruflich auf das nächste Element setzt.
    Ein häufiger fehler ist es nämlich in einem Schleifendurchlauf mehrmals next() aufzurufen.

    mfg
    Martin
    Geändert von mccae (26.03.10 um 19:04 Uhr)
     

  8. #8
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Stimmt.
    Es ist deine Entscheidung, einige sagen man soll die Iteratoren verwenden, ein paar raten davon ab. Ist unter Umständen auch eine Glaubensfrage, Google verratet da sicher mehr. Ich selbst verwende immer eine eigene Countervariable, so wie z. B. hier (grad geschrieben)

    Code java:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    
    private static void load(String username, Client client)
    {
        Building playersHeadquarter = null;
        for(int i = 0; i < Client.getBuildingCount() && playersHeadquarter == null; i++)
        {
            Building building = Client.getBuilding(i);
            if(building.getTyp().isTyp(Building.BUILDING_TYP_HEADQUARTER) && building.getOwner().equals(username))                  
            {
                playersHeadquarter = building;
                client.setHeadquarter(building);
            }
        }
    }
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  9. #9
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Hey.

    Das heißt also doch lieber die erw. For-Schleife bei ArrayLists?

    Ich bin noch neu bei Java, deswegen weiß ich leider noch nicht was eine LinkList ist im Vergleich zur ArrayList.
     

  10. #10
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Eine LinkedList ist (von außen) quasi das selbe, nur schreiben/löschen ist schneller und Feldzugriff langsamer als bei einer Array.
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  11. #11
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    Zitat Zitat von lisali Beitrag anzeigen
    Ich bin noch neu bei Java, deswegen weiß ich leider noch nicht was eine LinkList ist im Vergleich zur ArrayList.
    Na ja, eine ArrayList verwaltet die Daten intern als Array, welches sich selbst vergrößert.

    Eine ArrayList ist zu wählen, sollte man keine Elemente aus der Mitte entfernen wollen, oder welche in die Mitte hinzufügen wollen, da die ArrayList bei soetwas langsam arbeitet.

    Warum?
    Die ArrayList müsste bei so einer Operation ein neues Array erstellen und den Inhalt des alten in ein neues kopieren.

    Die ArrayList hat eine bessere Performance indem man wie du es oben gezeigt hast, eine for Schleife verwendet und die Elemente direkt über den Index anspricht.


    Eine LinkedList verwaltet die Elemente, indem jedes Element auf das nächste Element "zeigt".
    Wenn man bei so einer Liste also etwas aus der mitte löscht, zeigt das Element vor dem gelöschten einfach auf das nach dem gelöschten.

    Also ist sie eine LinkedList besser geeignet, sollte man Elemente bearbeiten/hinzufügen/entfernen will die nicht am Anfang oder Ende stehen.

    Diese Art Liste sollte man umbedingt mit einem Iterator durchlaufen.


    Bitte beachte, dass die Performanceunterschiede erst ab größeren Datenmengen merkbar sind.
    Dennoch sollte man immer die richtige Art von List wählen.
    Geändert von mccae (26.03.10 um 19:19 Uhr)
     

  12. #12
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Zitat Zitat von Kai008 Beitrag anzeigen
    Eine LinkedList ist (von außen) quasi das selbe, nur schreiben/löschen ist schneller und Feldzugriff langsamer als bei einer Array.
    Was genau meinst du mit "von außen"?

    Na ja, eine ArrayList verwaltet die Daten intern als Array, welches sich selbst vergrößert.

    Eine ArrayList ist zu wählen, sollte man keine Elemente aus der Mitte entfernen wollen, oder welche in die Mitte hinzufügen wollen, da die ArrayList bei soetwas langsam arbeitet.

    Die ArrayList hat eine bessere Performance indem man wie du es oben gezeigt hast, eine for Schleife verwendet und die Elemente direkt über den Index anspricht.

    Eine LinkedList verwaltet die Elemente, indem jedes Element auf das nächste Element "zeigt".
    Wenn man bei so einer Liste also etwas aus der mitte löscht, zeigt das Element vor dem gelöschten einfach auf das nach dem gelöschten.

    Diese Art Liste sollte man umbedingt mit einem Iterator durchlaufen.

    Bitte beachte, dass die Performanceunterschiede erst ab größeren Datenmengen merkbar sind.
    Okay, danke für die Erklärung. Vorhin fiel mir dazu noch eine Frage ein, die mir wieder jetzt in den Sinn kommt, wegen dem hasNext().

    Wenn die Liste leer ist und man das mit hasNext() bzw. dem Iterator prüft, kann es nicht zu Exceptions kommen, oder? Hoffe das ist keine blöde Frage.


    Edit: Achja und in welchen Fällen benutzt oder bevorzugt man eher die LinkedList der ArrayList und wann diese VectorList eigentlich?
     

  13. #13
    Avatar von mccae
    mccae mccae ist offline Senfdazugeber
    Registriert seit
    Dec 2007
    Ort
    Wien
    Beiträge
    226
    Hallo!

    hasNext() liefert einfach false, wenn keine Elemente vorhanden sind.

    Ein aufruf von next() danach wird mit einer Exception bestraft.

    mfg
    Martin.

    Edit:

    ...bevorzugt man eher die LinkedList der ArrayList und wann diese VectorList eigentlich?
    Es hängt davon ab was du machen willst.

    Ein Vector ist threadsafe, kann also von konkurrierenden Threads ohne Nebeneffekten bearbeitet werden.
    Will man threadsichere Lists, und andere Collections, kann man die synchronizedXXX Methoden der Klasse Collections benutzen.

    So weit bist du aber noch nicht...

    Wenn du nicht vor hast deine ArrayList zu bearbeiten (aus der Mitte löschen und in die Mitte einfügen), kannst du bei dieser bleiben.
    Geändert von mccae (26.03.10 um 19:25 Uhr)
     

  14. #14
    Kai008 Kai008 ist offline Mitglied Brillant
    Registriert seit
    May 2008
    Ort
    Brunn/Geb. (Niederösterreich)
    Beiträge
    944
    Blog-Einträge
    1
    Einfach von deiner Benutzer/coderebene aus.
    Doch, wenn man Zugreift fliegt eine NoSuchElementException, aber hasNext() verhindert das Ausführen der while.
    Den Einsatz von LinkedList hat mccae schon gesagt.

    Vector weiß ich nicht, aber ich denke dass kommt aus einer älteren Version für Abwärtskompatiblität.


    Edit: Ok, ich überlasse dir den Thread, sonst wird das hier unüberschaubar. >_<
     
    Mein kleiner webstart Projektplaner:
    http://178.77.101.236/ppws/
    Ideen, Verbesserungsvorschläge, Bugsmeldungen und allg. Kritik erwünscht und erbeten.

    Danke. :)

  15. #15
    Avatar von lisali
    lisali lisali ist offline Mitglied Brokat
    Registriert seit
    Feb 2009
    Ort
    Berlin
    Beiträge
    381
    Aber zum Aufruf bzw. zur Ausführung des Body's, wenn ich mit hasNext() prüfe, kommt es ja dann sowieso nicht, dass eine Exception gar nicht in Frage kommen kann, oder?

    Also, bevorzugt man LinkedList immer nur dann eher der ArrayList, wenn man davon ausgehen kann, dass Daten im Wertebereich bzw. Element-Index, weit entfernt des Start- bzw. End-Indezes zu ändern sind? Eben weil das Array eine neues Array erstellen muss nicht wie bei der LinkedList?
    Oder was genau meint man sonst mit "Mitte"?
    Also, ich versteh das so,dass ich z.B. ein Array hab mit über 1000 Elementen und die Mitte wäre dann einfach irgendwo weit vom Ende der Liste?
    Aber kann man nciht eigentlich einfach einen Eintrag leicht "überschreiben" mit Angabe der Index-Nummer?

    list.add(50,"bla");

    ?

    Spielt bei dem ganzen eine VectorList nochmal eine ganz andere Rolle oder wobei zieht man die in Betracht?
     

Ähnliche Themen

  1. Ganz kurze Frage: SHOW COLUMNS außer...
    Von knallbernd im Forum Relationale Datenbanksysteme
    Antworten: 4
    Letzter Beitrag: 12.07.07, 15:06
  2. Ganz kurze Frage zu GDLib
    Von Vertigo21 im Forum PHP
    Antworten: 16
    Letzter Beitrag: 20.04.06, 17:35
  3. Wahrscheinlich einfach - kurze Frage, kurze Antwort
    Von rotekiste im Forum Flash Plattform
    Antworten: 1
    Letzter Beitrag: 19.02.05, 15:12
  4. Kurze Frage zu break in schleife
    Von Shizzl_chrizzl im Forum Java
    Antworten: 3
    Letzter Beitrag: 16.11.04, 10:56
  5. ganz kurze frage
    Von snow crash im Forum Photoshop
    Antworten: 2
    Letzter Beitrag: 01.12.01, 15:00