2D Array auslesen gibt nur letzten Wert aus

Pagaty

Mitglied
Hallo,

beim versuch ein 2D Array auszulesen habe ich ein Problem.

Es wird immer nur der letzte Wert im Array ausgegeben und ich bekomme folgende Fehlermeldung:

Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
at ohnegui.read.main(read.java:57)


Java:
        for (int zeile = 0; zeile < meinInteger; zeile++)
        //{System.out.println("in ausgabe schleife 1");}
        {
            for (int spalte = 0; spalte < array[zeile].length; spalte++){
            	System.out.println("in ausgabe schleife 2");
                System.out.print( array[zeile][spalte] + " ");
                System.out.println("in ausgabe schleife 3");
            }
        }

meinInteger ist die Anzahle der Zeilen.

Dies ist die Ausgabe von Eclipse

Code:
in ausgabe schleife 2

    iii
   in ausgabe schleife 3
in ausgabe schleife 2
9 in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
in ausgabe schleife 2
null in ausgabe schleife 3
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2
	at ohnegui.read.main(read.java:57)

Weis jemand wo mein Denkfehler liegt?

Danke im Voraus

Pagaty
 
meinInteger ist wahrschienlich größer als array.length

er gibt doch eine 9 und dann null saus, ist das array größtenteils leer?

mach mal
Code:
Syso(Arrays.toString(array))
udn schau dir an wie dein array aussieht
 
Hallo,
mach mal Syso(Arrays.toString(array))
gibt folgendes aus
Code:
[[Ljava.lang.String;@1e5a5dc, [Ljava.lang.String;@1ec41c0]


meinInteger habe ich genommen um die geaue länge des Arrays zu haben, mit der ich das Array erzeugt habe.
Habe mal in array.length getauscht, aber keine Änderung erreicht.

Damit ist das Array erzeugt worden
Java:
        List methods = datei.getRootElement().getChildren("Zeitstempel"); 
        int countMethods = methods.size();
        Integer meinInteger = new Integer(countMethods);
        
        String[][] array = new String[2][meinInteger];
        Iterator itr = datei.getRootElement().getChildren("Zeitstempel").iterator();
        
        for (int zeile=0; zeile<meinInteger; zeile++){
        	while (itr.hasNext()) {
	            Element elem = (Element) itr.next();
	            //System.out.println(elem.getText());
	            //System.out.println(elem.getAttributeValue("ID"));
	            array[zeile][0]=elem.getText();
	            array[zeile][1]=elem.getAttributeValue("ID");
	            System.out.println(array[zeile][0]);
	            System.out.println(array[zeile][1]);
	        }
        }

hier gibt er die Werte noch aus
Code:
    aaa
  
1

    bbb
  
2

    ccc
  
3

    ddd
  
4

    eee
  
5

    fff
  
6

    ggg
  
7

    hhh
  
8

    iii
  
9

Ich weis nicht, wo die Leerzeilen herkommen. Kann es damit zusammenhängen?

Danke Pagaty
 
> Leerzeilen

untersuche doch, was elem.getText() usw. ist, da scheinen die Leerzeilen mit dabei zu sein,
einfach nicht riesen große Schleifen bauen, alles gleichzeitig ausgeben und das Durcheinander nicht mehr zu durchblicken,
sondern in aller Ruhe mit einem Wert anfangen

du schreibst übrigens alle Elemente in array[0][0] + array[0][1] für zeile == 0,
am Ende hast du maximal zwei Werte gespeichert, der Rest ist überschrieben,
nachdem itr fertig ist und die for-Schleife 1x weitergeht, ist itr immer noch leer

> new String[2][meinInteger]
soll sicherlich
> new String[meinInteger][2]
sein

achte genau in welchen Dimensionen du welche Wertebereiche als Indexe verwendest
 
Java:
        for (int zeile=0; zeile<meinInteger; zeile++){
        	while (itr.hasNext()) { //<---- Das hier ist dein Problem
	            Element elem = (Element) itr.next();
	            //System.out.println(elem.getText());
	            //System.out.println(elem.getAttributeValue("ID"));
	            array[zeile][0]=elem.getText();
	            array[zeile][1]=elem.getAttributeValue("ID");
	            System.out.println(array[zeile][0]);
	            System.out.println(array[zeile][1]);
	        }
        }

Du schreibst in dein ersten eintrag des Arrays (also array[0][1]) insgesammt 9 mal und zwar erst 1, dann 2, dann 3, ... bis 9 und in (also array[0][0]) schreibst du aaa dann bbb dann ccc ... bis iii in die felder array[1][0] ... schreibst du nur null
 
Probier mal sowas

Java:
for (int zeile=0; zeile<meinInteger; zeile++){
            if (itr.hasNext()) {
                Element elem = (Element) itr.next();
                //System.out.println(elem.getText());
                //System.out.println(elem.getAttributeValue("ID"));
                array[zeile][0]=elem.getText();
                array[zeile][1]=elem.getAttributeValue("ID");
                System.out.println(array[zeile][0]);
                System.out.println(array[zeile][1]);
            }else{
                 array[zeile][0]="gab nix zu lesen"
                array[zeile][1]="-1";
                System.out.println(array[zeile][0]);
                System.out.println(array[zeile][1]);
            }
        }
 
Hallo,
untersuche doch, was elem.getText() usw. ist, da scheinen die Leerzeilen

Simmt habe jetzt
Code:
array[zeile][0]=elem.getTextTrim();
verwendet, und die Leerzeilen sind weg. Danke

achte genau in welchen Dimensionen du welche Wertebereiche als Indexe verwendest

Gesten abend kam mir die Erkenntnis, das es echt wichtig ist immer genau zu wissen "wo" man sich gerade befindet. Da muss ich wohl noch viel üben.
Habe es getauscht.

@bone2
Die Ausgabe ist jetzt
Code:
[iii, 9][null, null]
Die Daten sind nicht da !!! Gut zu wissen

Du schreibst in dein ersten eintrag des Arrays (also array[0][1]) insgesammt 9 mal

Hmm...
Ich hab mir das so gedacht:
Die for schleife "erezugt" die Zeilen, daher zeilen<meinInteger
Wenn die erste Zeile [0] erzeugt wurde schreibt er solange etwas ins array[0][solange itr ist],
dann geht es wieder in die for-Schleife [1] und so weiter.

Sorry für die Dumme Frage, aber steht das so nicht da?
Offensichtlich nicht, sonst würde es ja funktionieren.
Wo liegt mein Logikproblem?


//EDIT

Die if/else Anweisung funktioniert!

Es wird alles richtig ausgegeben.
"gab nix zu lesen" erscheint nirgends, aber es funktioniert.

Das ist zwar schön, aber ich verstehe noch nicht warum.
Der else Block kommt doch garnicht zur Ausführung. Oder doch?

Vielen Dank erst mal !!!

Pagaty
 
Vielen Dank an alle die mir geholfen haben.

Ich konnte durch die Tipps einiges ausmerzen.
Voraussichtlich war das Hauptproblem die vertauschten indexe.

Woran ich noch knabbere ist, das ich jetzt noch mal um zu testen die if Anweisung gegen die while getauscht habe und es auch funktionierte.
Vorher hatte ich die indexe getauscht und es ging nicht.

Aber das ist nichts was hier gelöst werden muss.

Vielen Dank noch mal
 
Ja der else Block kommt nicht außer du erhöst deine Zahl der zu lesenden Zeilen ohne die Zeilen zu erhöhen ;-) (Also sollte nicht kommen) [Also das if kann man auch weg lassen, das ist nicht nötig]

Dein Ansatz ist schon richtig, nur halt leider nicht ganz. Du müsstest über deinen iterator außen iterieren und dann innen über dein Array, aber da dein Array ja nur begrenzt Platz hat, ist das auch doof, bei einer Liste aber ok.

So z.B.
Java:
int zeile=0;
   while (itr.hasNext()) {
                Element elem = (Element) itr.next();
                array[zeile][0]=elem.getText();
                array[zeile][1]=elem.getAttributeValue("ID");
                System.out.println(array[zeile][0]);
                System.out.println(array[zeile][1]);
                zeile++;
            }
Jedoch kann es so bei einer zu langen eingabe dazu führen, das du eine outOfBounds Exception bekommst, deswegen lieber eine Liste.

Java:
   Liste myListe=new ArrayList();
   while (itr.hasNext()) {
                String[] array=new String[2];
                Element elem = (Element) itr.next();
                array[0]=elem.getText();
                array[1]=elem.getAttributeValue("ID");
                System.out.println(array[0]);
                System.out.println(array[1]);
                myList.add(array);
            }
 

Neue Themen


Zurück
Oben