Verschachtelte for-Schleife mit Löschen von Iterationen. Wie über Iterator abbilden?

Status
Nicht offen für weitere Antworten.

Jagito

Mitglied
Hallo,
sitze gerade an einem Problem, bei dem ich nicht weiter komme. Bin Java Beginner. Wie kann ich folgende for-schleife richtig abbilden? Das Problem liegt darin, dass ich bestimmte Elemente entferne, wodurch die for-Schleife nicht mehr funktioniert (ArrayIndexOutOfBoundsException)

Hier das KSKB
Java:
 import java.util.*;
 
 class LabelType
{
  public LabelType(int a, int b) //
  {
    r_a = a;
    r_wa = b;
  }
  public int r_a;
  public int r_wa; 	
}

public class KSKB {

    public static void main (String[] args) {
	int anzknoten = 2;		
    ArrayList liste[] = new ArrayList[anzknoten]; //Eine Zahl mehr, da Knoten 0 nicht vorhanden
    for (int i=0;i<=anzknoten;i++){
    	liste[i] = new ArrayList();
    }
    LabelType la = new LabelType(0,0); 
    liste[0].add(la);
    
    LabelType lb = new LabelType(1,2); 
    liste[0].add(lb);
            
    LabelType lc = new LabelType(2,3); 
    liste[0].add(lc);   

			int a=1;
			while (a<=anzknoten) {
	        		for (int g=0; g<liste[a].size();g++) {
	        			for (int h=g+1; h<liste[a].size();h++){ 
	        				LabelType aux_g = (LabelType) liste[a].get(g);
	        				LabelType aux_h = (LabelType) liste[a].get(h);
	        				if (aux_g.r_a<=aux_h.r_a && aux_g.r_wa<=aux_h.r_wa){
	        					liste[a].remove (aux_h); 	        					        					
	        				}
	        				else{
	        				}
	        			}
	        		}
	        		a++;
			}
    }
}

Mein Lösungsvorschlag würde mit Iterator gehen, doch dann erhalte ich auch eine ArrayIndexOutOfBoundsException.
Java:
			int a=1;
			while (a<=anzknoten) {
    			Iterator <LabelType> itr_1 = liste[a].iterator(); 
					while(itr_1.hasNext()) { //Ersatz für 1. for-Schleife
					    LabelType aux_g = itr_1.next();
					    for (Iterator <LabelType> iter_2 = liste[a].iterator(); iter_2.hasNext();) { //Ersatz für 2. for-Schleife
					    	LabelType aux_h = iter_2.next();							    		    		          							   	     
							    if (aux_g.r_a<aux_h.r_a && aux_g.r_wa<=aux_h.r_wa){
							    	iter_2.remove();
					    		}
					    }					
					}
	        		a++;
			}
Wo habe ich einen Fehler gemacht?
Danke euch,
Jan
 

AmunRa

Gesperrter Benutzer
Wenn du Elemente entfernst ist es fast immer leichter wenn du dein Array/ Liste von Hinten nach vorne durchgehst

Java:
int a=anzknoten;
            while (a>=1) {
                    for (int g=liste[a].size()-1; g>=0;g--) {
                        for (int h=liste[a].size()-1; h>=g+1;h--){ 
                            LabelType aux_g = (LabelType) liste[a].get(g);
                            LabelType aux_h = (LabelType) liste[a].get(h);
                            if (aux_g.r_a<=aux_h.r_a && aux_g.r_wa<=aux_h.r_wa){
                                liste[a].remove (aux_h);                                                            
                            }
                            else{
                            }
                        }
                    }
                    a--;
            }


edit: Da ich nicht weis was dein Code macht bin ich mir nicht sicher ob meiner den selben effekt hat. Er sollte nur zeigen wie man etwas rückwerts durchläuft.
 
Zuletzt bearbeitet:

Michael...

Top Contributor
Verstehe zwar aufgrund der kryptischen Variablenbezeichner nicht ganz genau worum es hier geht, aber wenn man etwas per Schleife aus einer Liste löscht, empfiehlt es sich die Liste von hinten nach vorne durchzulaufen. Damit sollten einige potentielle Fehlerquellen, die eine ArrayIndexOutOfBoundsException werfen könnten, ausgeschlossen sein.
 

Jagito

Mitglied
Danke AmunRa und Michael für die schnelle Antwort.
Habe den rückwärts-laufenden Code ausprobiert. Dieser liefert leider immernoch eine IndexOutOfBoundsException.

Zur Erklärung, was der Code machen soll:

Es ist ein Netzwerk aus Knoten. Jedem Knoten ist eine unterschiedlich große Menge von 2-dimensionalen Vektoren, auch Label genannt, (abgebildet über die class LabelType) zugeordenet. Alle diese Labels sind in einer Arraylist gespeichert, wobei die Arraylist abhängig vom Knoten ist.

Ich möchte nun zu einem Knoten a, die Labels diesen Knotens miteinander vergleichen und u.U. dominierte Label löschen. D.h. konkret schaue ich ob ein Label in beiden Dimensionen (r_a und r_wa) kleiner als ein anderes ist. Dann kann ich dieses Label löschen.
 

AmunRa

Gesperrter Benutzer
Hab jetzt dein Program mal selbst ausgeführt und der Fehler steht doch e schon in der Exception

java.lang.ArrayIndexOutOfBoundsException: 2
at TEst.main(TEst.java:20)

In zeile 20 is der Fehler



daraus folgt
zeile 19 muss so lauten

for (int i=0;i<anzknoten;i++){ //statt for (int i=0;i<=anzknoten;i++){
 

AmunRa

Gesperrter Benutzer
so hab dann auch noch meine schleifen eigefügt (aber auch hier muss es dann heisen

int a= anzahlKnoten-1

hier das lauffähige Program

Java:
import java.util.*;
 
 class LabelType
{
  public LabelType(int a, int b) //
  {
    r_a = a;
    r_wa = b;
  }
  public int r_a;
  public int r_wa;  
}
 
public class TEst {
 
    public static void main (String[] args) {
    int anzknoten = 2;      
    ArrayList liste[] = new ArrayList[anzknoten]; //Eine Zahl mehr, da Knoten 0 nicht vorhanden
    for (int i=0;i<anzknoten;i++){
        liste[i] = new ArrayList();
    }
    LabelType la = new LabelType(0,0); 
    liste[0].add(la);
    
    LabelType lb = new LabelType(1,2); 
    liste[0].add(lb);
            
    LabelType lc = new LabelType(2,3); 
    liste[0].add(lc);   
    int a=anzknoten-1;
    while (a>=1) {
            for (int g=liste[a].size()-1; g>=0;g--) {
                for (int h=liste[a].size()-1; h>=g+1;h--){ 
                    LabelType aux_g = (LabelType) liste[a].get(g);
                    LabelType aux_h = (LabelType) liste[a].get(h);
                    if (aux_g.r_a<=aux_h.r_a && aux_g.r_wa<=aux_h.r_wa){
                        liste[a].remove (aux_h);                                                            
                    }
                    else{
                    }
                }
            }
            a--;
    }
    System.out.println("Erfolgreich");  
    }
    
}

Du musst sehr aufpassen bei Arrays und listen.

Der Letzte index eines Array ist immer array.lenght() -1
oder list.size() -1;

schau dir das nocheinmal genau an den zusammenhang zwischen Länge und Indexes.

Index startet immer bei 0 und hört wie geschrieben auf
 

Jagito

Mitglied
Danke AmunRa,
was für ein blöder Fehler. Das Minimalbeispiel setze ich nun in größerer Version um. Mal schauen, was rauskommt.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Verschachtelte for-Schleife Java Basics - Anfänger-Themen 2
laxla123 Verschachtelte If-Else Schleife Java Basics - Anfänger-Themen 21
S Verschachtelte Schleife Java Basics - Anfänger-Themen 3
Y Verschachtelte For-Schleife Java Basics - Anfänger-Themen 5
S verschachtelte for-Schleife Java Basics - Anfänger-Themen 6
J verschachtelte Schleife Java Basics - Anfänger-Themen 10
P Verschachtelte Schleife vorzeitig abbrechen. Java Basics - Anfänger-Themen 50
S verschachtelte for Schleife und Ergebniss. Java Basics - Anfänger-Themen 3
C Verschachtelte For-Schleife Java Basics - Anfänger-Themen 6
J Verschachtelte for schleife mit dynamischer Anzahl an Schleifen Java Basics - Anfänger-Themen 10
W verschachtelte while schleife Java Basics - Anfänger-Themen 8
W verschachtelte For-Schleife - continue Java Basics - Anfänger-Themen 8
R Verschachtelte Schleife? Java Basics - Anfänger-Themen 6
W Verschachtelte If-else --> finde meinen Fehler nicht Java Basics - Anfänger-Themen 30
Düsseldorf2002 Datentypen Verschachtelte LinkedList Java Basics - Anfänger-Themen 5
J Verschachtelte Methoden Java Basics - Anfänger-Themen 9
P Verschachtelte Hashmap Java Basics - Anfänger-Themen 6
P Verschachtelte Array Liste Java Basics - Anfänger-Themen 2
B Verschachtelte For Schleifen Java Basics - Anfänger-Themen 8
W Verschachtelte Objekte wieder auspacken Java Basics - Anfänger-Themen 3
F Methoden Verschachtelte if else Methode Java Basics - Anfänger-Themen 10
Z Verschachtelte If-Bedingung Java Basics - Anfänger-Themen 6
D verschachtelte Schleifen Java Basics - Anfänger-Themen 6
M Verschachtelte Forschleifen Java Basics - Anfänger-Themen 2
F Klassen Zugriff auf verschachtelte Objekte Java Basics - Anfänger-Themen 11
J static verschachtelte Klassen und innere Klassen Java Basics - Anfänger-Themen 1
TheMenox Verschachtelte If Bedingung Java Basics - Anfänger-Themen 4
R Verschachtelte Arraylist und deren Größe auslesen Java Basics - Anfänger-Themen 7
C Verschachtelte Map auslesen Java Basics - Anfänger-Themen 4
H Best Practice Wie mit break verschachtelte Schleifen komplett verlassen? Java Basics - Anfänger-Themen 2
F Verschachtelte Schleifen Java Basics - Anfänger-Themen 4
J Hilfe verschachtelte Schleifen Java Basics - Anfänger-Themen 5
F Erste Schritte Switch case vs. Verschachtelte If Anweisung Java Basics - Anfänger-Themen 11
G Collections verschachtelte ArrayList abfüllen Java Basics - Anfänger-Themen 5
X verschachtelte suche Java Basics - Anfänger-Themen 8
S Verschachtelte Exceptions - Übersicht verbessern Java Basics - Anfänger-Themen 2
D Verschachtelte Objekterzeugung Java Basics - Anfänger-Themen 6
X Verschachtelte Annotationen Java Basics - Anfänger-Themen 9
J verschachtelte for-schleifen Java Basics - Anfänger-Themen 2
S Verschachtelte Klassen Java Basics - Anfänger-Themen 12
D Verschachtelte IF-Anweisung Java Basics - Anfänger-Themen 10
C Verschachtelte for-schleifen Java Basics - Anfänger-Themen 10
C Verschachtelte For-Schleifen Java Basics - Anfänger-Themen 5
3 Verschachtelte Zuweisung Java Basics - Anfänger-Themen 4
M Tief verschachtelte Packages Java Basics - Anfänger-Themen 7
T add-Methode für verschachtelte ArrayLists Java Basics - Anfänger-Themen 10
E Verschachtelte If-Anweisungen - "else without if" Java Basics - Anfänger-Themen 4
T Datentypen Verschachtelte Map durchlaufen Java Basics - Anfänger-Themen 4
P Verschachtelte For-Schleifen Java Basics - Anfänger-Themen 4
F Verschachtelte Arrays kopieren und überschreiben Java Basics - Anfänger-Themen 4
M Verschachtelte Strukturen. Java Basics - Anfänger-Themen 7
M Viele verschachtelte Schleifen Java Basics - Anfänger-Themen 14
A Verschachtelte Hashtable ausgeben. Java Basics - Anfänger-Themen 3
G Verschachtelte Case Fallunterscheidung Java Basics - Anfänger-Themen 7
M sehr weit verschachtelte XML-datei mit jdom auslesen Java Basics - Anfänger-Themen 4
S verschachtelte while Schleifen Java Basics - Anfänger-Themen 5
R Bedingte Opeatoren / Verschachtelte Operatoren Java Basics - Anfänger-Themen 4
M While-Schleife mit Wartezeit Java Basics - Anfänger-Themen 15
T Ich brauche eine Schleife die eine beliebige Zahl so lange durch 10 teilt bis zur Null Java Basics - Anfänger-Themen 5
DrahtEck Schleife soll wieder da anfangen wo ich es möchte ! Java Basics - Anfänger-Themen 17
Finn_lol Fehlermeldung bei Schleife mit Array Java Basics - Anfänger-Themen 4
Ranger229 Endless loop in while Schleife Java Basics - Anfänger-Themen 3
MaZ Quadrat Schleife(Pyramide) Java Basics - Anfänger-Themen 9
M Datentypen While-Schleife eine Java Methode erstellen Java Basics - Anfänger-Themen 3
P Wie kann diese Schleife beenden Java Basics - Anfänger-Themen 1
T float soll durch schleife die größte mögliche Zahl herausfinden, Ausgabe ist aber "Infinity" Java Basics - Anfänger-Themen 1
T Variable in Schleife deklarieren, Speicherplatz, Garbage Collector Java Basics - Anfänger-Themen 10
Ostkreuz While Schleife neustarten Java Basics - Anfänger-Themen 20
M Problem bei verschachtelter for-Schleife bei zweidimensionalen Arrays Java Basics - Anfänger-Themen 3
S Erste Schritte do-while Schleife Münzwurf Java Basics - Anfänger-Themen 1
S while Schleife Taschenrechner Java Basics - Anfänger-Themen 1
P Best Practice While loop schleife Java Basics - Anfänger-Themen 5
ohneInformatik; For Schleife. Was macht dieser Code?? Java Basics - Anfänger-Themen 5
I For Schleife Summe berechnen Java Basics - Anfänger-Themen 13
A Erste Schritte Aufgabe mit while Schleife Java Basics - Anfänger-Themen 11
R do while Schleife Verständnisfrage Java Basics - Anfänger-Themen 2
Say Fehlenden Code finden in einer while-Schleife? Java Basics - Anfänger-Themen 11
N Warum Springt iterator nur in der Schleife weiter Java Basics - Anfänger-Themen 9
J for Schleife kleinste Zufallszahl finden Java Basics - Anfänger-Themen 25
A Return in While Schleife Java Basics - Anfänger-Themen 6
M Erste Schritte While Schleife / Ausgabe von buchstabe & ASCII Wert Java Basics - Anfänger-Themen 4
J do..while Schleife Java Basics - Anfänger-Themen 14
J Java To String Methode, Array mit For-Schleife Java Basics - Anfänger-Themen 2
S Textausgabe in einer For-Schleife Java Basics - Anfänger-Themen 12
B Automatisierte Ausgabe (Schleife, If-Abfrage?) Java Basics - Anfänger-Themen 24
C 2D Array Ausgabe mit for-Schleife i,j Java Basics - Anfänger-Themen 4
T Mit jedem Wert in der for-Schleife weiter arbeiten Java Basics - Anfänger-Themen 3
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
F for-Schleife halbiert Durchläufe ungewollt Java Basics - Anfänger-Themen 6
ravenz Schleife mit for über String Array „zahlen“und prüfen ob Wert „a“ oder „b“ oder „c“ entspricht (mittels || ) Java Basics - Anfänger-Themen 4
Bugs Bunny Fehlerhafte Berechnung beim erneuten Durchlaufen der Schleife Java Basics - Anfänger-Themen 5
J Methoden iterator for-schleife (hasNext() ) Java Basics - Anfänger-Themen 7
S Was macht ++ ohne Schleife? Java Basics - Anfänger-Themen 4
LFB In einer For-Schleife alles in einer Zeile ausgeben Java Basics - Anfänger-Themen 14
Neuling47 for schleife Java Basics - Anfänger-Themen 6
M Variable in einer Schleife initialisieren Java Basics - Anfänger-Themen 46
B Zuweisungen und Methodenaufrufe in Bedingung der while Schleife? Java Basics - Anfänger-Themen 2
JavaBeginner22 Würfeln bis 6 while Schleife Java Basics - Anfänger-Themen 13
D EinMalEins mithilfe einer for-Schleife und Array Java Basics - Anfänger-Themen 1
xanxk Problem For-Schleife mit Charakter Java Basics - Anfänger-Themen 2

Ähnliche Java Themen

Neue Themen


Oben