Hallo!
Wir sollen als Hausaufgabe eine sortierte Liste mit n Werten (n zufällig von 10-50) mit Zufallszahlen von 1 bis 1000, welche sortiert eingefügt werden sollen, erzeugen. Dazu sollen wir die LinkedList<Integer> und den ListIterator benutzen.
Mein Code fügt zwar Werte hinzu aber leider nicht in der richtigen Reihenfolge. Bin schon am verzweifeln ;(
Kann mir bitte jemand helfen?
Vielen, vielen dank im vorraus.
Edit: bin inzwischen schon so weit, dass nur noch das letzte Element in der Liste nicht in der richtigen Reihenfolge ist.. *seufz*
Java:
importjava.util.LinkedList;importjava.util.ListIterator;publicclassLLexample{LinkedList<Integer> theList =newLinkedList<Integer>();// an empty listint n;// stores the size of the listintintGenerator(){return(int)(999.0*Math.random())+1;}publicLLexample(){filltheList();}publicvoidfilltheList(){
n =(int)(40.0*Math.random())+10;// Zufallszahlen von 10-50int zufall;//wird n mal ausgeführtfor(int index =1; index <= n; index++){ListIterator<Integer> iterator = theList.listIterator(0);
zufall =intGenerator();//zufallswert erzeugenif(theList.isEmpty()){//falls es der erste Eintrag ist
theList.addFirst(zufall);continue;}//solange bist wir am Ende der Liste sind oder wir einfügen könnenwhile((iterator.hasNext())&&(zufall>=iterator.next())){}//Wenn der richtige Platz gefunden wurde einfügen
theList.add(iterator.previousIndex(), zufall);}}
//solange bist wir am Ende der Liste sind oder wir einfügen könnenwhile((iterator.hasNext())&&(zufall>=iterator.next())){}//Wenn der richtige Platz gefunden wurde einfügen
theList.add(iterator.previousIndex(), zufall);
Das ist das du vergisst den zu überschreibenden Wert nicht zwischenspeicherst.
Daher wird der Wert auf Position previousIndex mit dem neuen Zufalls wert überschrieben.
Du müsstest hier zuerst alle folgenden Wert um eine Index Position nach hinten verschieben.
Und dann erst denn neuen Zufalls Wert an die Position einfügen.
Auf keinen Fall sollte man eine Liste verändern, während man deren Iterator benutzt. Das führt zu ConcurrentModificationExceptions. Du musst also mit ListIterator.add(E) auskommen.
Das ist das du vergisst den zu überschreibenden Wert nicht zwischenspeicherst.
Daher wird der Wert auf Position previousIndex mit dem neuen Zufalls wert überschrieben.
Du müsstest hier zuerst alle folgenden Wert um eine Index Position nach hinten verschieben.
Und dann erst denn neuen Zufalls Wert an die Position einfügen.
Hallo, danke schonmal für die Antwort.
Hab ich dich richtig verstanden? theList.add(index, E) überschreibt den Wert an der Stelle Index anstelle ihn einzufügen?
@Ebenius
Dir auch danke für die Antwort. Ich hab mal probiert es mit der addfunktion von ListIterator umzuschreiben. Das sieht dann so aus:
Java:
publicvoidfilltheList(){
n =(int)(40.0*Math.random())+10;// Zufallszahlen von 10-50int zufall;//wird n mal ausgeführtfor(int index =1; index <= n; index++){ListIterator<Integer> iterator = theList.listIterator(0);//iterator erzeugen
zufall =intGenerator();//Zufallswert erzeugen// solange bis wir am Ende der Liste sind oder wir einfügen könnenwhile((iterator.hasNext())&&(zufall>=iterator.next())){}// Wenn der richtige Platz gefunden wurde einfügenif(iterator.hasNext()){// mitten drin einfügen
iterator.previous();// Einen Schritt zurück
iterator.add(zufall);// Element einfügen}else
iterator.add(zufall);//am Ende einfügen}}
Und das letzte Ergebnis stimmt gelegentlich immer noch nicht
iterator.hasNext() nach der Schleife aufzurufen bringt wenig, da durch den next()-Aufruf verfälscht,
Credo: normalerweise immer previous aufrufen, nur dann nicht, wenn die while-Schleife wegen Ende abgebrochen wurde
Java:
for(int index =1; index <= n; index++){ListIterator<Integer> iterator = theList.listIterator(0);// iterator erzeugen
zufall =intGenerator();// Zufallswert erzeugen// solange bis wir am Ende der Liste sind oder wir einfügen könnenboolean hasNext =true;while((hasNext = iterator.hasNext())&&(zufall >= iterator.next())){}if(hasNext){
iterator.previous();}
iterator.add(zufall);}
Bezüglich des überschreiben muss ich mich doch nochmal korrigieren habe noch mal in der API nachgelesen.
Inserts the specified element at the specified position in this list. Shifts the element currently at that position (if any) and any subsequent elements to the right (adds one to their indices).
Hallo zusammen, ich als Anfänger habe auch ein Problem mit Iterator und habe mir gedacht ich poste es hier.
meine aufgabe/problem ist: Die Notiz die suchbegriff enthält soll ausgegeben werden sonst "Keine...gefunden" ausgeben Die Methode gibt aber nur die Notiz mit suchbegriff aus. was fehlt bei dem Quellcode?
[Java]
public void notizSuchenMitIterator(String suchbegriff)
{
boolean hasNext = true;
Iterator<String> it= notizen.iterator();
while(it.hasNext())
{
String notiz = it.next();
if(notiz.contains(suchbegriff))
{
pro Jahr gibts doch sicher 400 Themen zu Iterator, kommen die jetzt alle hier rein?
wobei das diesmal gar nichts direkt mit Iterator zu tun hat
Java:
boolean gefunden =false;Schleife{
wenn irgendwas ausgegeben wird, dann auch gefunden auf true setzen
}if(!gefunden){System.out.println("Keine Notiz mit "+ suchbegriff +" gefunden");}
es muss ein Iterator zum einsatz kommen.(Bedingung) und dieser muss im else - prüfen ob der Durchlauf schon am Ende der Notizliste ist , falls am Ende und keine Notiz mit suchbegriff gefunden, muss er "Keine ...gefunden" ausgeben. Meine Frage ist mittlerweile konkreter: wie sieht die Klammer im else( ? ) aus damit er die fehlermeldung ausspuckt?
die boolean Variable gefunden brauchst du in jedem Fall, auch wenn du das in der Schleife im else machst,
zusätzlich musst du noch abfragen, ob der Iterator zu Ende ist
if(!it.hasNext()) kam dir nicht in den Sinn?
und ein weiteres mal: du darfst nicht immer am Ende diese Meldung ausgeben, boolean gefunden nutzen!
die muss natürlich auch gesetzt werden wenn was gefunden wurde..