Liste ändern während Iteration über Diese?

berndoa

Top Contributor
Hallo,
ich hoffe mir kann Jemand bei den Details einer Sache helfen.
Ich mache mal ein vereinfachtes Beispiel von dem was ich vorhabe:

Java:
public class Test{
    List<Integer> numbers=new Arraylist<Integer>;
    List<Integer> result=new ArrayList<Integer>;

    public void main (String[] args){
        Test obj=new Test();
    }

    public Test(){
        for(int i=1;i<10;i++){
            numbers.add(i);
        }
        recurs();   
    }

    public void recurs(){
        if(result.getLength()>=5){
            //result Liste drucken
            return;
        }

        for(int a:numbers){
            numbers.remove(a);
            result.add(a);
            recurs();
            result.remove(a);
        }
    }

}

Kann sein dass einige Befehle nicht perfekt sind, soll mehr als Algorithmusskizze dienen.

Um was es mehr geht:
Kann ich das so machen dass ich in der for each schleife, die ja durch die elemente der Lsite numbers iteriert, die lsite selbst um das gerade gewählte element verkürze?

Endresultat dieser recurs Methode soll sein dass eben alle Anordnungen von Elementen aus numbers gedruckt werden.
Dass das Ganze auch ohne Rekursion besser geht, wieß ich.
Aber bei meiner eigentlichen Aufgabe, mit der ich mich befasse (Blackjack) komme ich da nicht um die Rekursion drum herum.

Hier im Beispiel stelle man sich das Klassisch vor wie im Kombinatorikunterricht, Shcüssel mit 10 durchnummerierten Kugeln, der Reihe nahc werden 5 Kugeln getroffen.
Am Ende soll die Liste aller möglichen 5Tupel da stehen.

Nur befürchte ich, dass wenn ich in der for each schleife die Liste um ein element verkürze, jenes Element bei der Iteration nicht mehr zur verfügung steht.

Oder wie macht das java, ist da die Lsite über die Iteriert wird, "fest" (weil sich java bspw. eine kopie davon macht, über di letztlich die iteration läuft)?
Oder führt das shcleifeninterne Elemententfernen zu unerwarteten Ergebnissen bei der Iteration?
Falls ja, gibts unter Beibehaltung der Rekursion und so eine Möglichkeit, diese Effekte zu vermeiden (ausser halt vor jeder for each shcleife eine Listenkopie zu erzegen, über die stattdessen iteriert wird)?
 
Y

yfons123

Gast
Kann ich das so machen dass ich in der for each schleife, die ja durch die elemente der Lsite numbers iteriert, die lsite selbst um das gerade gewählte element verkürze?
nein weil es denn enumerator zershcießen würde, somit gehts nicht mit foreach loop
 

httpdigest

Top Contributor
Es geht, wenn du nicht die erweiterte for-Schleife nimmst, sondern per Iterator:
Java:
for (Iterator<Integer> it = numbers.iterator(); it.hasNext();) {
  Integer a = it.next();
  it.remove();
  // ...
}
Da du aber _dieselbe_ Liste in einer _neuen_ Iteration rekursiv innerhalb einer äußeren Iteration ebenfalls veränderst, wird auch das nicht gehen.
 

berndoa

Top Contributor
Hm, schade.
Weil mein Code ist ja eigentlich so geplnt,d ass man im schleifenrumpf erst ein element der lsite entfernt, dann in die nächsttiefere rekursionstiefe geht, dort irgendwas macht, wieder "hochkommt" und das zuvor entfernte element wieder hinzugefügt wird.

Dass also im von Beginn bis Ende des Schleifenrumpfes erst was gemacht wird mit der Liste, was dann gewissermassen rückgängig gemacht wird durch wiedereinfügen des Elements.

Also zustand der liste zu beginn und ende jeder schleifeniteration der gleiche ist.

Vermutlich müsste ich einfahc mal selbst an einem Beispiel austesten was passiert :)
 

berndoa

Top Contributor
du verstehst halt nicht wie die arraylist und der enumerator funktioniert
Stimmt, habe ich keine Ahnung davon :)

Und wenn ich bspw. java Enumerator google, kommt nur Kram zu "Enums" -.-

Edit:
Kann man eigentlich irgendwie gut nachlesen was java da der Reihe nach macht wenn es so eine Schleife abarbeitet? :)
 
Zuletzt bearbeitet:

berndoa

Top Contributor
hm, kann man das irgendwo genauer nachlesen was da bei der Schleifenabarbeitung und so im Detail poassiert und warum es den iterator "zerschießen" würde?
Würde echt gerne verstehen warum es da schief geht
 

Neumi5694

Top Contributor
hm, kann man das irgendwo genauer nachlesen was da bei der Schleifenabarbeitung und so im Detail poassiert und warum es den iterator "zerschießen" würde?
Würde echt gerne verstehen warum es da schief geht
Beispiele.
Iterier mal diese Zeichen A,B,C,D,E
Und jetzt entferne im zweiten Schritt die 4. Was wird am Ende alles iteriert? A,B,C,E nehm ich an.
Und damit hat der Iterator seine Aufgabe nicht mehr erfüllt, er sollte nämlich alle 5 Zeichen liefern.
Oder ... Man entfernt in Schritt 2 das "B". Damit rutscht das 'C' ja an die zweite Stelle. Was soll nun im dritten Schritt ausgegeben werden? 'D'?
Deshalb wird das verhindert, wenn du for-each verwendest. Dadurch entstehen Inkonsistenzen.

Es ist möglich, genau das zu machen (Beispiel steht oben), dafür muss man aber tatsächlich einen Iterator verwenden und nicht den for-each Automatismus.

Was bei dir noch gefährlicher wird: Du iterierst über die Liste, in rekursivenn Methoden dann über die reduzierte Liste und entfernst auch dort Werte. Kein Automatismus kann erraten, was zum Geier du dir dabei gedacht hast, deshalb musst du das manuell machen und selbst mit OutOfBounds und ähnlichem klarkommen.

Du hast da eh ein gefährtliches Design-Problem: Eine rekursive Methode greift auf eine Liste gespeichert in einer Klassenvariable zu und verändert sie ... ganz böse. Rekursive Methoden sollten grundsätzlich nur mit den ihnen zur Verfügung gestellten Daten arbeiten.


Falls du darauf verzichten kannst, Elemente rauszunehmen oder hinzuzufügen, dann ist sublist sehr praktisch. Es greift auf die selbe Liste zu, bildet aber nur einen Teil davon ab (mit verschobenen Indizes natürlich). Sehr praktisch für Rekursionen..
 

berndoa

Top Contributor
Sublists tuts im Zweifel auch.

Vielleicht sollte ich kurz darlegen was eigentlich gedacht war, was passieren soll (vielleicht hätte ich besser eine normale for schleife nehmen sollen):


Java:
Die Liste (a,b,c,d,e) wird der for schleife zum iterieren übergeben.
in der ersten iteration wird das zeichen a ausgewählt als "iterierungsobjekt".
es wird in dieser iterierungsrunde erst die liste um das a gekürzt, list ist alsonun (b,c,d,e).
dann wird durch den rekursionsaufruf so manches getan,
die liste ist aber, wenn der rekursionsaufruf zu ende ist, (wieder) die selbe.
der liste wird, sozusagen als umkehroperation zu dem "entferne a" vorhin, nun wieder ein a hinzugefügt.
wir sind am ende der 1. iteration angekommen, alles abgearbeitet, die lsite lautet (nun wieder) (a,b,c,d,e).

die for schleife, so als ob nie was passiert wäre, geht in die nächste rund eund list aus der, immer noch (a,b,c,d,e)
lautenden liste, den nächsten buchstaben b ab.
rinse and repeat.

Natürlich , wenn sich java aufregt weil ich in einer iterationsrunde überhaupt die liste anfasse,
dann ist das nervig.
eigentlich könnte es java egal sein,
denn bevor java am ende der iterationsrunde "eins weiter" geht, wurde die lsite auf das wiederhergestellt
was sie  zum beginn der iterationsrunde war.
zumindest was die enthaltenen elemente und deren reihenfolge angeht.

Falls natürlich java sich an irgendwelchen komishc generierten unique list ids oder so orientiert,
da wird die liste wohl sich geändert haben und nicht mehr gleich sein.


Generell will ich halt so die struktur

Code:
rekursionsfunktion{
//prüfe ob rekursionsanker, falls ja, returne

//andernfalls mache
//1. elementlöschen
//2. rekursionsaufruf
//3. elementadden


}

haben. ggbfls. um die 3 schritte noch eine for schleife drum herum.


blöd, das man listen nicht einfach verändern kann.

schließlich sorge ich durch den algorithmus selbst ja shcon dafür dass die liste, bevor der nächste iterationsschritt gemahct wird, wieder in den urzustand zurückversetzt wurde.
 

berndoa

Top Contributor
Hm, vielleicht wäre es sinnvoll, doch eher mit normaler for schleife zu arbeiten.
Nur speichert mir das halt die vorübergehend entfernten Elemente nicht, das ist auch recht blöd.

Wobei ich die ja wiederum in einer 2. lsite speichern könnte, wäre ggbfls. eh sinnvoll :)
 

berndoa

Top Contributor
Hm, habe mit der normalen for schleife so halbwegs was Funktionierendes gebaut,
nun wird nur über integers iteriert, die dann rein zufällig in der schleife als indizes genutzt werden.
Macht es nur natürlich nervig falls ich was ohne indizes wie LinkedList oder so habe :-/

Java:
import java.util.ArrayList; // import the ArrayList class
import java.util.*;


public class Test2{
    
    ArrayList<Integer> list = new ArrayList<Integer>();
    ArrayList<Integer> removed = new ArrayList<Integer>();
    int counter=0;
    
    public static void main(String[] args){
        Test2 test=new Test2();
        
    }
    
    public Test2(){
        for(int i=2;i<=6;i++){
            list.add(i*i);
        }
        
        
        recurs();
        System.out.println("counter="+counter);
        
    }
    
    
    public void recurs(){
        if(list.size()<=0){
            //print removed list
            System.out.println();
            for(int j=0;j<removed.size();j++){
                System.out.print(removed.get(j));
                System.out.print(" ");
            }
            System.out.println();
            counter++;
            return;
        }
        int size=list.size();
        for(int i=0;i<size;i++){
            
            removed.add(list.get(0));
            list.remove(0);
            
            recurs();
            
            list.add(removed.get(removed.size()-1));
            removed.remove(removed.size()-1);
        }
        
    }
    
    
    
    
    
}
 

mihe7

Top Contributor
Wenn Du wolltest, könntest Du hier die Objektorientierung nutzen.

Quick & Dirty und ungetestet:
Java:
public class HidingListView<E> extends AbstractList<E> {
    private final List<E> list;
    private final int hiddenIx;
    public HidingListView(List<E> list, int hiddenIx) {
        this.list = list;
        this.hiddenIx = hiddenIx;
    }

    @Override
    public int size() {
        if (list.isEmpty()) return 0;
        int size = list.size();
        return size - (0 <= hiddenIx && hiddenIx < size ? 1 : 0);
    }

    @Override
    public E get(int ix) {
        if (hiddenIx < 0) return list.get(ix);
        return list.get(ix < hiddenIx ? ix : ix - 1);
    }
}

Und dann übergibst Du halt Sichten auf die Liste:
Java:
public void rekursiveMethode(List<String> list) {
    // ...

    for (int i = 0, n = list.size(); i < n; i++) {
        rekursiveMethode(new HidingListView<String>(list, i));
    }
}
 

Neumi5694

Top Contributor
blöd, das man listen nicht einfach verändern kann.
Doch, das geht ganz einfach (außer bei Konstrukten wie Sublisten natürlich, welche ja nur ein Abbild darstellen und keine echte Liste). Das Problem ist, wie du erwartest, dass die Schleife darauf reagiert, da gibt's eben mehrere Möglichkeiten und Java weiß nicht, welche davon du haben möchtest. Deswegen musst du in dem Fall das mit den Iteratoren ja auch händisch machen.

Um die Linkedlist brauchst du dir keine Gedanken zu machen, deine Karten wissen ja nichts von ihren Nachbarn, also wäre das eh der falsche Weg.

Zwischenspeichern ist eine einfache Lösung. Wenn du in einer Schleife mehrere Elemente löschen willst, dann kannst du diese in einer toDelete-Liste speichern und NACH der Schleife mit list.removeAll(toDelete) entfernen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
OSchriever Einfach verkettete Liste ändern Allgemeine Java-Themen 43
Fynn29 Liste sortieren ohne Array und ohne vorgegebene Sortierung Allgemeine Java-Themen 24
MiMa Filtern von TableView Liste Allgemeine Java-Themen 2
B Liste aller Kombintionen mit Einschränkungen Allgemeine Java-Themen 8
TheSepp Wie kann man Leerzeichen aus einer Array liste entfernen? Allgemeine Java-Themen 10
D Erste Schritte Liste erweitern Allgemeine Java-Themen 11
sserio Variablen Liste erstellt und ein Problem mit dem Index Allgemeine Java-Themen 6
L allgemein Strings händisch in Liste sortieren Allgemeine Java-Themen 47
M einfach verkettete Liste verstehen Allgemeine Java-Themen 23
Drachenbauer wie kann ich alle instanzen einer Klasse durchsehen, ohne, dass diese in einer Liste erzeugt wurden? Allgemeine Java-Themen 11
Gaudimagspam Skip Liste erstellen in Java Allgemeine Java-Themen 3
G Java Editor Löschen doppelter Zahlen einer Liste Allgemeine Java-Themen 2
bueseb84 Spring Boot Entity mit Liste Allgemeine Java-Themen 4
MiMa Werte in liste speichern? Allgemeine Java-Themen 3
Curtis_MC Collections Liste anhand mehrere Kriterien sortieren Allgemeine Java-Themen 6
K verkettete Liste Allgemeine Java-Themen 3
G Liste (UsageStats) sortieren (Android) Allgemeine Java-Themen 5
T Google Links in einer Liste Allgemeine Java-Themen 4
looparda Liste filtern nach Prädikaten verschiedener Typen Allgemeine Java-Themen 3
L Liste überschreibt alte Elemte Allgemeine Java-Themen 10
H Länge einer verketteten Liste Allgemeine Java-Themen 4
E Erstellen einer Liste mit einer maximalen Menge an Elementen Allgemeine Java-Themen 13
P Element einer Liste wurde hinzugefügt, aber es gibt keinen Zugriff Allgemeine Java-Themen 2
S Methoden Liste soll Methode aus innerer Klasse aufrufen Allgemeine Java-Themen 4
L Erste Schritte Liste von Datums filter nach Monate Allgemeine Java-Themen 4
Y Liste in Stream Packen Allgemeine Java-Themen 1
K Einfache Verkettete Liste mit Node Allgemeine Java-Themen 3
perlenfischer1984 Reflection : Element in generische Liste hinzufügen Allgemeine Java-Themen 4
perlenfischer1984 Liste mit generics zurück liefern Allgemeine Java-Themen 8
S Verkettete (Teil)Liste sortieren ( rekursiv bis n) Allgemeine Java-Themen 2
G Liste zwischen zwei Kalenderdaten erstellen Allgemeine Java-Themen 3
B Wie vergleiche ich Strings in einer Liste? Allgemeine Java-Themen 5
Viktim Threads Liste In unterschiedlichen Threads bearbeiten Allgemeine Java-Themen 23
A Collections Inhalt einer Liste mit Inhalt anderer Liste vergleichen ? Allgemeine Java-Themen 7
I Abstrakte Datentypen - Liste Allgemeine Java-Themen 9
D Datentypen Klassenattribut aus Objekt in generischer Liste Allgemeine Java-Themen 15
P Liste zu Objekt umwandeln Allgemeine Java-Themen 4
Z In die Liste kann ich nichts adden Allgemeine Java-Themen 16
C Liste checken auf MINDESTENS ein Objekt | Bukkit Allgemeine Java-Themen 3
M liste von listen anders ausgeben Allgemeine Java-Themen 1
B Per Buttonklicks einer Liste Wörter hinzufügen - Wie umsetzen? Allgemeine Java-Themen 11
H Liste sortieren anhand optionalem Property Allgemeine Java-Themen 3
L Liste führt sich nicht weiter Allgemeine Java-Themen 5
A Input/Output Liste der Dateien in einem Ordner in einer Jar Datei erhalten Allgemeine Java-Themen 11
J Fragen zu generischer doppelt verketteter Liste (bei fehlendem Grundverständnis) Allgemeine Java-Themen 1
B Prüfen, ob ein Element in der Liste nicht existiert Allgemeine Java-Themen 3
B Klassen JTable mit einer Liste Allgemeine Java-Themen 0
X HTTP Auslesen der Ergebnisse von einer Webseite und in eine Liste packen Allgemeine Java-Themen 1
A Auslesen einer Datei sowie ausgeben als Liste in App Allgemeine Java-Themen 5
E Liste löscht sich selbstständig Allgemeine Java-Themen 5
H Liste von Objekten generisch sortieren Allgemeine Java-Themen 0
D Liste anhand Standardnormalverteilung befüllen Allgemeine Java-Themen 1
M Threads synchroner Zugriff (add/delete/read) auf eine Liste Allgemeine Java-Themen 6
T Datentypen Eine Liste - verschiedenen Klassen - eine Abstracte Klasse Allgemeine Java-Themen 3
M Werte aus DB in Liste speichern ohne mehrfach speicherung Allgemeine Java-Themen 18
G Liste anzahl der gleichen Objekte Allgemeine Java-Themen 6
S Pattern.Match Suche: For Schleife einbinden und in Liste schreiben Allgemeine Java-Themen 3
O aus Liste ein beliebiges Element auswählen Allgemeine Java-Themen 7
J Liste aller Com-Ports - zweistellige Ports? Allgemeine Java-Themen 15
O MVC - wo Liste der ComboBox-Items ermitteln Allgemeine Java-Themen 3
MiMa Liste von Pfaden in eine textArea schreiben Allgemeine Java-Themen 7
K kontinuierlich aktuelle Bestellsystem-Liste mit farbigem Status Allgemeine Java-Themen 2
A Auswählbare Liste Allgemeine Java-Themen 2
D Sortieren von Liste zu unperformant Allgemeine Java-Themen 6
N Liste gesucht Allgemeine Java-Themen 2
Z Sortiertes Einfügen in doppelt verkettete Liste Allgemeine Java-Themen 5
S Probleme beim Auslesen einer Liste Allgemeine Java-Themen 8
O JSON String bauen aus Liste Allgemeine Java-Themen 2
M Über Liste verschiendene JComponents mit eigenem implementierten Interface ansprechen Allgemeine Java-Themen 7
T Hashmap mit geordneter/ungeordneter liste als Value Allgemeine Java-Themen 5
D Zugriff auf Array-Liste Allgemeine Java-Themen 19
S Threads Liste mit Objekten in Teillisten zerlegen und abarbeiten Allgemeine Java-Themen 3
R ThreadPool - vorhandene thread liste überprüfen bzw. aufräumen Allgemeine Java-Themen 3
pg1337 Liste füllen Allgemeine Java-Themen 2
U Große Liste von Strings mit indiziertem Zugriff Allgemeine Java-Themen 31
B Properties File Liste Allgemeine Java-Themen 3
Gossi Collections Liste zusammenfassen für JSP Allgemeine Java-Themen 4
Gossi Collections (Unbekannte) Liste Sortieren Allgemeine Java-Themen 10
T Collections Liste schnell/nebenläufig durchgehen Allgemeine Java-Themen 2
M Objekt aus Liste in Liste suchen/löschen Allgemeine Java-Themen 6
Q "Doppelte" Einträge einer Liste entfernen Allgemeine Java-Themen 14
C Exponentielle Verteilung in einer Liste Allgemeine Java-Themen 7
Nic.o liste der installierten Zertifikate ?! Allgemeine Java-Themen 3
T Liste mit GregorianCalendar-Objekten in List einlesen, mit Collection sortieren und ausgeben Allgemeine Java-Themen 3
M Verständnisfragen bezüglich Liste Allgemeine Java-Themen 3
S AWT Wie bekomme ich eine Liste aller chars in einem Font? Allgemeine Java-Themen 3
J Zeichenketten-Liste filtern Allgemeine Java-Themen 6
S Aus einer Liste<Oberklasse> alle Elemente die eine bestimmte Unterklasse von Oberklasse haben filter Allgemeine Java-Themen 8
K Liste aller implementierenden Klassen einer Oberklasse anzeigen Allgemeine Java-Themen 4
M Eintrag verschwindet aus Liste Allgemeine Java-Themen 3
E Objekte in einer Liste suchen. Allgemeine Java-Themen 4
I Über eine Liste iterieren und Objekte löschen. Wie löst man das sauber? Allgemeine Java-Themen 5
reibi Kopie einer Liste Allgemeine Java-Themen 4
N Liste mit Map abgleichen extrem langsam Allgemeine Java-Themen 6
C Darstellung der Liste bei vielen Daten extrem langsam Allgemeine Java-Themen 11
T Liste sortieren Allgemeine Java-Themen 6
L Objekte in Liste packen Allgemeine Java-Themen 2
N Liste aendern waehrend des iterierens ueber selbige Allgemeine Java-Themen 11
B Datenstruktur: Liste Allgemeine Java-Themen 5
S Liste mit verschiedenden Objekten Allgemeine Java-Themen 15

Ähnliche Java Themen

Neue Themen


Oben