OutOfBounds Exception bei ArrayList

RaRu

Mitglied
Hi Leute!

bin noch relativ unerfahren mit Java und muss nun für die Uni ein Programm schreiben, welches unter anderem eine Textfile ließt, in welchem Punktdaten drinstehen.
Leider stehen die Koordinaten der Punkte nicht geordnet, also x1, y1, x2, y2,... etc.
Alle X-Koordinaten fangen mit der Zahl 3 an, die Y-Koordinaten fangen mit 5 an, deshalb
habe ich für X- und Y-Koordinaten jeweils eine eigene ArrayList gemacht.
Die supportXList wird auch richtig gefüllt, die supportYList jedoch nicht.
Wahrscheinlich ein sehr dummer Fehler, aber ich bin noch nicht so der Schleifen und Arrayexperte...

Bekomme eine OutOfBoundsException an der rot-markierten Stelle.
Kann mir jemand einen Tipp geben?

Code:
                (Text einlesen aus der Datei...)
		// splitten Anfang
		StringTokenizer st = new StringTokenizer(text);
		
		// die support list supportxlist speichert alle x werte, die supportylist speichert alle y werte
		List<Double> supportXList = new ArrayList<Double>();
		List<Double> supportYList = new ArrayList<Double>();
		
		// füllt die support Listen jeweils mit x und y elementen
		while(st.hasMoreTokens())
		{
			for(int i=0; i <= st.countTokens(); i++){
				if(st.nextToken().isEmpty()){break;}
				else{
					String s = st.nextToken();
					
					Double d = Double.valueOf(s);
					
					// wenn der token eine 3 am anfang hat, wird er ins das supportXList array geschrieben
					if(s.charAt(0)=='3'){
						supportXList.add(d);
						// System.out.println(supportXList.toString());
						// System.out.println(supportXList.size());
					}
					// wenn der token eine 5 am anfang hat, wird er ins das supportYList array geschrieben
					if(s.charAt(0)=='5'){
						supportYList.add(d);
						System.out.println(supportYList.toString());
						System.out.println(supportYList.size());
					}
					else{}
				}
			}
		}
		
		List<Line> lineList = new ArrayList<Line>();
		// füllt die lineList mit punkten aus den support listen 
		for(int i=0; i<=supportXList.size();i++){
			// erst werden die elemente aus der ArrayListe in double geparst
			double x1 = supportXList.get(i);
			double y1 = supportYList.get(i);		// ERROR: OUT OF BOUNDS
			double x2 = supportXList.get(i+1);
			double y2 = supportYList.get(i+1);

			lineList.add(new Line(new Point(x1,y1),new Point(x2,y2)));
		}
 

zeja

Erfahrenes Mitglied
Erstmal ist der StringTokenizer deprecated und sollte nicht mehr genutzt werden.

Wie ist denn der Aufbau deiner Datei? Vielleicht gibt es da eine sinnvollere Lösung.

Ich nehme mal an dass er irgendwie nichts findet was mit 5 beginnt. Dein else dazu ist leer, vielleicht solltest du da mal das aktuelle Token ausgeben lassen.
 

RaRu

Mitglied
Hallo zeja!

danke für die schnelle Antwort.
Was schlägst du Anstelle des StringTokenizers vor?

So sehen die Daten in der Datei aus - insgesamt 23 Zeilen,
der erste Wert ist der y1 Wert, dann kommen x1, y2 und x2.
5761493.50 3404040.75 5761507.50 3404036.25
5761507.50 3404036.25 5761561.00 3404020.75
5761561.00 3404020.75 5761596.00 3404009.25
5761596.00 3404009.25 5761621.50 3404000.50
5761621.50 3404000.50 5761640.00 3403987.00
5761640.00 3403987.00 5761668.50 3403967.25
5761668.50 3403967.25 5761688.50 3403953.00
5761688.50 3403953.00 5761707.00 3403942.00
...

Ich probier das mit dem else mal eben aus.
Grüße RaRu
 

zeja

Erfahrenes Mitglied
Datei einlesen
Für jeden Zeile String line ein line.split(" ") du erhälts dann ein String Array mit 4 Einträgen. Entsprechend kannst du jeden Eintrag in ein Double übertragen und in deine Listen packen.

Das ist aber auch noch nicht unbedingt schön.
 

RaRu

Mitglied
ok dann nochmal anders angefangen:

Code:
public class TextFileReader4 extends InputReader {

	public void generateTextFileReader(String pfadInput) throws FileNotFoundException{
		
		File file = new File(pfadInput);
		
		// die support list supportxlist speichert alle x werte, die supportylist speichert alle y werte
		List<Double> supportXList = new ArrayList<Double>();
		List<Double> supportYList = new ArrayList<Double>();

		String[] segmente = new String[100];
		Scanner scanner = new Scanner(file);
		while (scanner.hasNextLine()){
			 
			String s = scanner.nextLine();		// jede Zeile wird in den String s geschrieben
			
			
			segmente = s.split(" ");			// teilt den String s in 4 Teile, anhand von Leerzeichen
			

//			double x1 = segmente.get(2);
//			supportXList.add(Double.valueOf(segmente.get(2)));

			
			System.out.println(s);
			System.out.println(Arrays.toString(segmente));
		}	
	}
}

supportXList.add(Double.valueOf(segmente.get(2)));
langsam verzweifel ich -> wie greife ich denn auf die position 2 des segmente string arrays zu? irgendwas stimmt da nicht.
 

RaRu

Mitglied
So. Die supportXList und supportYList sind nun gefüllt mit den richtigen Elementen.
Leider scheint bei der Schleife die ich rot markiert habe etwas nicht zu funktionieren.
Ich hab leider keine Ahnung warum es nicht funktioniert...
Kann mir jemand helfen?

Code:
public class TextFileReader4 extends InputReader {

	public void generateTextFileReader(String pfadInput) throws FileNotFoundException{
		
		File file = new File(pfadInput);
		
		// die support list supportxlist speichert alle x werte, die supportylist speichert alle y werte
		List<Double> supportXList = new ArrayList<Double>();
		List<Double> supportYList = new ArrayList<Double>();

		String[] segmente = new String[100];
		Scanner scanner = new Scanner(file);
		while (scanner.hasNextLine()){
			 
			String s = scanner.nextLine();		// jede Zeile wird in den String s geschrieben
			
			segmente = s.split(" ");			// teilt den String s in 4 Teile, anhand von Leerzeichen
			
			double x1 = Double.valueOf(segmente[1]);
			double y1 = Double.valueOf(segmente[0]);
			double x2 = Double.valueOf(segmente[3]);
			double y2 = Double.valueOf(segmente[2]);
			supportXList.add(x1);
			supportXList.add(x2);
			supportYList.add(y1);
			supportYList.add(y2);
			
			System.out.println(s);
			System.out.println(Arrays.toString(segmente));
	
		}	
		System.out.println(supportXList);
		
		List<Line> lineList = new ArrayList<Line>();
		// füllt die lineList mit punkten aus den support listen 
		for(int i=0; i<supportXList.size();i++){
			// erst werden die elemente aus der ArrayListe in double geparst
			double x1 = supportXList.get(i);
			double y1 = supportYList.get(i);		// ERROR: OUT OF BOUNDS
			double x2 = supportXList.get(i+1);
			double y2 = supportYList.get(i+1);

			lineList.add(new Line(new Point(x1,y1),new Point(x2,y2)));
		}
		
		PolyLine polyLine = new PolyLine();
		  // hinzufügen von Linien zur PolyLine
			for(int i = 0; i<=lineList.size(); i++){
				polyLine.addLineToPl(lineList.get(i));
			}
		
		  // Länge der PolyLine pl1 ermitteln
		  System.out.println(polyLine.getPlLength());
	}
	
}
 

Oliver Gierke

Erfahrenes Mitglied
Du greifst innerhalb der Schleife auf das nächste Element zu. Das sollte dir für das letzte Element der Liste einen Fehler geben, weil es da kein nächstes mehr gibt ;)

REINHAUN!
 

RaRu

Mitglied
ok klar ;)

ich muss der schleife doch einfach nur sagen das sie das beim letzten element nicht mehr tun soll, oder?

Code:
		List<Line> lineList = new ArrayList<Line>();
		// füllt die lineList mit punkten aus den support listen 
		for(int i=0; i<supportXList.size();i++){
			// erst werden die elemente aus der ArrayListe in double geparst
			if(supportXList.get(i) == supportXList.size()-1){break;}
			else{
			double x1 = supportXList.get(i);
			double y1 = supportYList.get(i);		// ERROR: OUT OF BOUNDS
			double x2 = supportXList.get(i+1);
			double y2 = supportYList.get(i+1);

			lineList.add(new Line(new Point(x1,y1),new Point(x2,y2)));
			}

klappt aber leider nicht. außerdem fällt mir auf, dass wenn ich jeweils 2 elemente aus den supportlisten hole, dass ja dann beim nächsten schleifendurchlauf ein element doppelt gelesen wird. alles suboptilmal!
kann ich bei der schleife for(int i=0; i<supportXList.size();i=i+2)
machen?