ArrayList(int index, Object) funktioniert nicht korrekt?

Rufus.Mueller

Bekanntes Mitglied
Guten Morgen,

ich setze mit sequenzbehaelterCollection.add(j, sequenzbehaelter); Elemente an die Stelle j einer ArrayList. Wenn ich eben eines dieser Elemente dann, z.B. mit System.out.print(sequenzVorrat.get(2).get(0).sequenzfolge[0] ); auslesen will, erhalte ich eine IOOBE. j kann Werte zwischen 2 und 9 annehmen. Ich habe in der Konsolenausgabe alles von get(2)...get(9) ausprobiert, die Exception wird immer geworfen. Die in die ArrayList eingefügten Elemente scheinen irgnedwie völlig anhanden gekommen zu sein. Wenn ich die erste Codezeile durch sequenzbehaelterCollection.add(sequenzbehaelter); und die zweite durch System.out.print(sequenzVorrat.get(...).get(0).sequenzfolge[0] ); ersetze funktioniert dagegen alles wie erwartet. Nur hätte ich die Elemente eben lieber an der von mir intendierten Stelle.

Java:
import java.io.BufferedReader;
import java.io.FileReader;
import java.io.IOException;
import java.util.ArrayList;
import java.util.LinkedList;



public class Sequenzeinleser {
	
	
	
	public Sequenzeinleser() {
	
	}
	

	
	ArrayList<Sequenzbehaelter> sequenzbehaelterCollection= new ArrayList<Sequenzbehaelter>();
	
	public ArrayList<Sequenzbehaelter> leseSequenzen() throws IOException {
		// Indexübersicht:
		//ein j für jede Datei (ist gleichzeitig die Sequenzlänge)
		//Zeilen gehen über die while-Schleife
		// ein i für jede Ziffer einer Zeile
		
		for (int j=2; j<10; j++ ) { //iteriert über alle Dateien mit den versch. Sequenzlaengen
			int k=j;
			
			Sequenzbehaelter sequenzbehaelter= new Sequenzbehaelter(j);
		
			FileReader fr = new FileReader("C:/Dokumente und Einstellungen/Ralf/Desktop/Sequenzen/S"+k+ ".txt");
			BufferedReader br = new BufferedReader(fr);
			
            String zeile;
            while (( zeile = br.readLine()) != null){ //über alle Zeilen einer Datei iterieren bis keine mehr da ist
            	
            	//System.out.println(zeile);
            	
            	
            	String[] zahlen = zeile.split("\t");
            	
            	//System.out.println(zahlen[0]);
            	
            	Sequenz  sequenz = new Sequenz(j);
            	
            	
            	for (int k1=0; k1<j; k1++){
            
            	}
            	
            	
            	for (int i=0; i<j; i++) { //iteriert über alle Ziffern einer Zeil
            	
            		sequenz.sequenzfolge[i]=Integer.parseInt(zahlen[i]);
            		} 
            	sequenzbehaelter.add(sequenz);
            	//System.out.println(sequenz.sequenzfolge[0]);
            	sequenzbehaelterCollection.add(j, sequenzbehaelter);
            //	sequenzbehaelterCollection.add(j-1, sequenzbehaelter);
            } // ende der äußersten for-Schleife
            
            
           

		}
		return sequenzbehaelterCollection;
	}
}


Java:
import java.awt.Frame;
import java.io.IOException;
import java.util.ArrayList;

import javax.swing.*;


public class WortCorsi {
	
	public static void main(String[] args) throws IOException{
		
	//	Window window = new Window();


	//	window.setVisible(true);
		ArrayList<Sequenzbehaelter> sequenzVorrat= new ArrayList<Sequenzbehaelter>();

		Sequenzeinleser sequenzeinleser = new Sequenzeinleser();
		sequenzVorrat = sequenzeinleser.leseSequenzen();
		
		
        System.out.print(sequenzVorrat.get(2).get(0).sequenzfolge[0] );
   //     System.out.println(sequenzVorrat.get(2).get(1).sequenzfolge[1] );
        
 /*      System.out.print(sequenzVorrat.get(9).get(1).sequenzfolge[0] );
        System.out.println(sequenzVorrat.get(12).get(1).sequenzfolge[1] );  */
        
        
        
		
		
		//System.out.println(sequenzeinleser.sequenzbehaelterCollection.get(0).get(0).sequenzfolge);
		
		
		

	}

}
 
Wenn [c]j[/c] nach der "Business Logic" von 2 bis 9 gehen sollte, warum belegst du dann nicht die Indizes 0 bis 7? Gib dann gleich in der ArrayList die Grösse der Liste (8) im Konstruktor an.
Du solltest für die Variablendeklaration immer nur mit dem Interface [c]List[/c] an Stelle von [c]ArrayList[/c] arbeiten. Also so was wie [c]List<Foo> list = new ArrayList<Foo>();[/c].

Edit: Habs gerade ausprobiert. Auch wenn man die initialCapacity auf x setzt, ist size trotzdem 0. Somit wird natürlich eine IOOBE geschmissen. Wenn du dich für eine fixe Anzahl Elemente mit fortlaufendem Index (0...n) interessiert, musst du wohl oder übel ein Array verwenden. Oder du verwendest eine Map<Integer, Typ>, welche den Index als Integer speichert.
 
Zuletzt bearbeitet:
Wenn [c]j[/c] nach der "Business Logic" von 2 bis 9 gehen sollte, warum belegst du dann nicht die Indizes 0 bis 7? Gib dann gleich in der ArrayList die Grösse der Liste (8) im Konstruktor an.

Ginge natürlich auch, anders wärs aber übersichtlicher find ich, weil an die Stelle [2] dann z.B. die Sequenzbehälter mit Sequenzen der Länge zwei, an [3] die Sequenzbehälter mit Sequenzen der Länge 3 usw. kommen sollen.

Du solltest für die Variablendeklaration immer nur mit dem Interface [c]List[/c] an Stelle von [c]ArrayList[/c] arbeiten. Also so was wie [c]List<Foo> list = new ArrayList<Foo>();[/c].

List ist doch eine Superklasse von ArrayList & Co, oder? Wieso sollte man die Superklasse verwenden, wenn man die speziellen Eigenschaften einer Subklasse will?


Edit: Habs gerade ausprobiert. Auch wenn man die initialCapacity auf x setzt, ist size trotzdem 0. Somit wird natürlich eine IOOBE geschmissen. Wenn du dich für eine fixe Anzahl Elemente mit fortlaufendem Index (0...n) interessiert, musst du wohl oder übel ein Array verwenden. Oder du verwendest eine Map<Integer, Typ>, welche den Index als Integer speichert.

Der Grund warum ich auf eine ArrayList zurückgegriffen habe ist der: Jede Sequenz darf nur einmal verwendet werden, meinen Informationen zufolge kann man aus einer ArrayList ein Element einfach rauslöschen, was bei einem Array nicht so einfach geht.


Verstehe ich Dich richtig, dass offenbar kein Programmierfehler für die Exception verantwortlich ist?
 
Hast mich auf die richtige Idee gebracht. Es kann in einer ArraYList ja kein zweites und keinen drittes Element geben wenn es kein 0. und kein 1. gibt. Habe daher einfach zwei "Füllelemente" erzeugt und diese an Position 0 und 1 eingefügt. Nun läuft die Sache rund.

Java:
	    Sequenzbehaelter x =new Sequenzbehaelter(0);
		Sequenzbehaelter y =new Sequenzbehaelter(0);
		
		sequenzbehaelterCollection.add(0, x);
		sequenzbehaelterCollection.add(0, y);
 
es ist immer ein Programmierfehler, aber da gibt es natürlich verschiedene Arten,
hier hast du falsche Grundannahmen vom Aufbau der Liste, es kann z.B. nicht auf Index 2 eingefügt werden wenn die Liste noch leer ist
(edit: auch selber erkannt),
schon beim Einfügen wird die Exception kommen, nicht erst beim Auslesen, interpretierst du deine Programmausgaben auch genau genug?

ein Array hat genug vorgegeben Platz, eine Map kann zu beliebigen Key, auch Zahlen speichern,
eine Liste braucht zwingend Indexe 0 bis n
 
Ginge natürlich auch, anders wärs aber übersichtlicher find ich, weil an die Stelle [2] dann z.B. die Sequenzbehälter mit Sequenzen der Länge zwei, an [3] die Sequenzbehälter mit Sequenzen der Länge 3 usw. kommen sollen.
Wenn du in deinem Datentypen (Array, Liste o.ä.) eine Range im Konstruktor angibst (from, to), dann kannst du bei allen Operationen intern einfach [c]- from[/c] rechnen - wo ist das Problem?
List ist doch eine Superklasse von ArrayList & Co, oder? Wieso sollte man die Superklasse verwenden, wenn man die speziellen Eigenschaften einer Subklasse will?
Dahinter verwendest du immer noch eine [c]ArrayList[/c], allerdings ist das eigentlich egal. Denn alle relevanten Methoden werden durch das Interface vorgegeben. Du könntest nachträglich so durch eine Zeile anpassen die [c]ArrayList[/c] in eine [c]LinkedList[/c] oder eine eigene Implementierung austauschen. Ohne Interface musst du überall alles anpassen.
Der Grund warum ich auf eine ArrayList zurückgegriffen habe ist der: Jede Sequenz darf nur einmal verwendet werden, meinen Informationen zufolge kann man aus einer ArrayList ein Element einfach rauslöschen, was bei einem Array nicht so einfach geht.
Klingt so, als wär eine Map villeicht wirklich der richtige Datentyp für dich.
Verstehe ich Dich richtig, dass offenbar kein Programmierfehler für die Exception verantwortlich ist?
Zumindest kein Programmierfehler in der Standard API 😉
 
Der Grund warum ich auf eine ArrayList zurückgegriffen habe ist der: Jede Sequenz darf nur einmal verwendet werden
eine ArrayList schützt nicht vor Duplikaten !
Java:
List<String> l = new ArrayList();
l.add("foo");
l.add("foo");
l.add("foo");
Was du suchst ist ein Set.

meinen Informationen zufolge kann man aus einer ArrayList ein Element einfach rauslöschen, was bei einem Array nicht so einfach geht.
eine ArrayList ist nix anderes als ein Array (woher sollte der Name sonst kommen ;-) ), der das List Interface implementiert. Das umständliche Löschen/Erweitern eines Arrays wird dir abgenommen, aber existieren tut es trotzdem
 

Neue Themen


Zurück
Oben