versuche gerade Java zu lernen und bin bei den Collections und Listen angekommen. Wollt jetzt ma versuchen Listen von Listen zu implementieren und dann versuchen die längste Liste auszugeben.
Habe mal versucht es zu programmieren, aber bin da eher skeptisch. Vll kann mir jemand mein Code verbessern und die Fehler erläutern. Kenn mich noch nicht so damit aus. Vielen Dank schonmal.
Java:
importjava.util.ArrayList;importjava.util.List;publicclassTest{publicstaticvoidmain(String[] args){ArrayList<List> liste =newArrayList<List>();publicListMaximum(){for(List s : liste){int max =0;if(s.size()> max){
max = s.size();}return s;}}}}
Wenn Du mal auf Deutsch versuchst, schritweise zu beschreiben, was Dein Code macht, wirst Du merken, was daran Käse ist. So als Tipp, es mag zwar sinnvoll sein, sich max als Vergleichswert zu merken, aber innerhalb der for-Schleife? Und letztlich musst du über die komplette Liste iterieren. D.h. return von innerhalb der for-Schleife ist auch falsch. Und irgendwo musst du Dir auch noch die aktuell längste Liste merken, dann wirst Du merken, dass Du max garnicht brauchst...
Die Größe selbst musst du dir nicht merken, sondern das Element, zu dem diese gehört. Also leg dir eine Variable maxList außerhalb der Schleife an, in die zu zunächst das erste Element reinpackst. Dann machst du mit jedem Schleifendruchlauf den test, ob die aktuelle Listenlänge größer als das bisherige Maximum ist und ersetzt ggf. die maxListe mit diesem aktuellen Element. Zum Schluss (NACH Verlassen der Schleife) gibst du maxListe zurück.
Dann nimm doch einfach irgendeine List Implementierung und erweitere diese um deine spezielle MaximumMethode:
Java:
package javaforum;importjava.util.Arrays;importjava.util.Iterator;importjava.util.LinkedList;importjava.util.List;publicclassMain{staticclassSpezielleListeextendsLinkedList<List>{ListgetMax(){if(isEmpty()){returnnull;}Iterator<List> iter =iterator();List max = iter.next();while(iter.hasNext()){List next = iter.next();if(next.size()> max.size()){
max = next;}}return max;}}publicstaticvoidmain(String[] args){SpezielleListe sl =newSpezielleListe();for(int i =0; i <100; i++){Integer[] ia =newInteger[(int)(Math.random()*1001)];Arrays.fill(ia, i);
sl.add(Arrays.asList(ia));}List max = sl.getMax();System.out.println(max.size());System.out.println(max);}}
Müssten Werte nahe 1000 rauskommen, habe mich für LinkedList Erweiterung entschieden.
Edit: ...oder schreib eine Methode, die die längste Liste zurück gibt - oder eine andere Erweiterung, welche sich beim hinzufügen/entfernen merkt, welche Liste momentan die längste Liste ist
Danke für die schnellen Antworten und sry für den ein oder anderen dummen Fehler bin noch am lernen =)
Hab es jetzt nochma versucht, vll kann mir da jemand wieder was zu schreiben. Vielen Dank.
Java:
importjava.util.ArrayList;importjava.util.List;publicclassTest{ArrayList<List> liste =newArrayList<List>();publicListmaximum(){List maxList = liste[0];for(List l : liste){if(l.size()> maxList.size()){
maxList = l;}}return maxList;}}
Ob man List maxList = liste[0] so schreiben kann, weiß ich nicht, vll kann dazu noch jemand was sagen.
Ja, sieht gut aus, nur hast du ein Attribut liste in deiner Klasse.
Zeile 8 kannst du nur so schreiben, wenn du sicherstellst, dass liste niemals keine Elemente enthält, sonst muss vorher geprüft werden, ob leer oder nicht.
Praktisch wäres, wenn man der Methode eine Liste mit Listen übergeben könnte.
wie meinst du dass ich ein Attribut liste in der Klasse habe. sry versteh die aussage nicht so =)
Ok, kannst du mir vll zeigen wie ich das vorher überprüfen kann, weil empty ist laut eclipse nicht definiert für den Typ ArrayList<List> oder wie könnte es man besser machen, weil bei liste[0] noch ein Fehler von eclipse angezeigt wird.
Sry wenn die Fragen vll etwas dumm gestellt sind, bin noch Anfänger =)
Schönen Abend noch.
Würde ich generell nicht machen.
Ich finde Vererbung überbewertet. Komposition oder Aggregation ist bei solchen Fällen oft der Vererbung vorzuziehen...
Würde ich auch nicht so machen, ist für die Praxis auch vielleicht nicht tauglich, aber als ich den ersten Beitrag gelesen hatte:
Java:
publicListMaximum(){
...dachte ich irrtümlich, es handle sich um eine Erweiterung von List.
Was du mit Komposition und Aggregation an dieser Stelle meinst, muss du nochmal erklären.
Jedenfalls jetzt erst mal BTT: Grundsätzlich gibt es zwei Vorgehensweisen: 1. Man merkt sich beim Hinzufügen/Entfernen immer die momentan längste Liste/das momentan größte Element oder man geht 2. alle Listen/Elemente durch und sucht die längste Liste/das größte Element.
3. Möglichkeit wäre, eine sortierte Datenstruktur zu verwenden.
@Fricko: Der Ansatz sieht gut aus, musst wie gesagt nur vorher prüfen, ob die Liste leer ist oder nicht, und du könntest daraus eine Klassenmethode/statische Methode machen, die nicht vom Kontext der Klasse/von einem konkreten Objekt abhängig ist.
genau, das meinte ich auch. Dabei wurde sogar mit generics gearbeitet.
Trotzdem könnte man beim Hinzufügen/Entfernen die Länge der Liste/Collection speichern, dann müsste man sich aber für eine List/Collection Implementierung entscheiden -> ist unausweichlich
Komposition >> Vererbung. Zum einen ist es schlecht sich von einer konkreten Implementierung abhaengig zu machen und auch sonst bindet man sich zu stark an eine Struktur, Mit Komposition ist man wesentlich freier und fuer Verwender strikter
Stimmt, das wäre besser. Aber nochmal: Ich war anfangs der irrtümlichen Überzeugung, es würde nur um eine List Erweiterung gehen.
1000 Dank für die Wiederauffrischung^^
Schau doch nochmal oben in meinen Post die Zeilen 13 bis 24. Manche bevorzugen es, Iterator zu nehmen. Falls die Liste leer ist (myList.isEmpty()) kann sofort z.B. null zurückgegeben werden. Sonst siehts gut aus.
Mit dem Iterator des will ich eher vermeiden, sieht iwie komplizierter aus =)
Eclipse zeigt bei List immer noch eine Warnung an, hab deshalb mal als Generics Object hinzugefügt, da List ja einfach ma alle Elemente aufnehmen kann. Kann ma das so machen? Die Warnung ist damit auf jeden Fall weg. Außerdem wollte ich das ganze jetzt einfach ma mit net main methode testen. nur blick ich da noch nicht so ganz durch vll, kann mir das jemand vervollständigen? Vielen Dank nochmals für die tolle Hilfe hier.
...das Problem ist einfach ohne Iterator, dass get(0), get(1) usw. -Aufrufe unter Umständen mehr Zeit benötigen...
Und (ist zwar nicht ganz OOP, aber egal) aus der Methode könntest du eine Klassenmethode machen (die static ist), die nicht von dem Attribut liste abhängig ist, sondern der eine Liste übergeben wird (die also einen Parameter vom Typ List oder Collection hat).
Gaaaaanz schlechtes Argument Aber kompliziert finde ich die Iteraroren nicht, du musst nur wissen, welchen Datentyp deine Listen sammeln, dann geht das ganz einfach:
Java:
Iterator<Integer> i =List#iterator();while(i.hasNext()){int zahl = i.next();}
V.a. das Durchlaufen und Prüfen, ob ein nächstes Element vorhanden ist, wird damit sehr schön sichtbar.
Also entweder Iterator verwenden (weil dann das nächste Element immer sofort gefunden wird/werden kann) oder Komposition/Aggregation verwenden, wobei sich beim Einfügen/Entfernen die längste Liste gemerkt wird.
Komposition/Aggregation hatte ich früher als HAT- bzw. KENNT-Beziehung kennengelernt, deshalb sagte mir das so erst mal nichts.