Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
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:
import java.util.LinkedList;
import java.util.ListIterator;
public class LLexample {
LinkedList<Integer> theList = new LinkedList<Integer>(); // an empty list
int n; // stores the size of the list
int intGenerator() {
return (int)(999.0*Math.random())+1;
}
public LLexample() {
filltheList();
}
public void filltheList(){
n = (int)(40.0*Math.random())+10; // Zufallszahlen von 10-50
int zufall;
//wird n mal ausgeführt
for(int index = 1; index <= n; index++){
ListIterator<Integer> iterator = theList.listIterator(0);
zufall = intGenerator(); //zufallswert erzeugen
if (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önnen
while((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önnen
while((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:
public void filltheList(){
n = (int)(40.0*Math.random())+10; // Zufallszahlen von 10-50
int zufall;
//wird n mal ausgeführt
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önnen
while((iterator.hasNext())&&(zufall>=iterator.next())){}
// Wenn der richtige Platz gefunden wurde einfügen
if (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önnen
boolean 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..