# Array Liste füllen



## Sophie (30. Okt 2010)

Hallo Zusammen

Ich habe ein Riesenproblem mit Array-Listen. Ich versuche gerade eine Aufgabe zu lösen, scheitere jedoch schon am füllen der Array Liste bzw. bei der Ausgabe auf der Konsole.
(Die Ausgabe auf der Konsole gehört nicht mit zur Aufgabe aber ich wollte ein bisschen ausprobieren deshalb soll jetzt erstmal gar nicht mit der Methode vergroessern() gearbeitet werden.)
Könnt Ihr mir vielleicht weiterhelfen mit dem füllen der Array-Liste und den ausgeben auf der Konsole?

Also ich habe nachgelesen, dass man eine Array-Liste nur mittels einer Schleife auf der Konsole ausgeben kann.
Eclipse meckert nun aber bei dieser Zeile:


```
for (int i : ms)
```

"Cannot iterate over an array or an instance of java.lang.Iterable"

Gruss
Sophie

Hier ist mein Quellcode

```
import java.util.*;

/*
 * 
 */
	public class MeineArrayList<E> {

	    private E[] list;
	    private int size;
	    private int capacity;
	    private int  increment;

	// with initial capacity c
	    public MeineArrayList(int c, int inc) {
	        capacity = c;
	        list = (E[]) new Object[c];
	        size = 0;
	        increment = inc;
	    }
	    	
	    public void add (E o){
	    	if (size>=capacity){
	    		vergroessern();
	    	}
	    	list[size]= o;
	    	size++;
	    }
	    private void vergroessern(){
	    	E[]list1 = java.util.Arrays.copyOf(list, increment + capacity); //2. Array wird erzeugt
	    	capacity = increment + capacity;
	    	list = list1;
	    }
}
```


```
public class MeineArrayListTest<E> {
 
	public static void main(String[] args) {
		
	MeineArrayList<String> ms = new MeineArrayList<String>(5,1);
	
	
    ms.add( new String ("a") );
    
        for (int i : ms) {
    	  System.out.println(ms);
    	}
	}
}
```


----------



## Haave (30. Okt 2010)

Deine Klasse MeineArrayList erbt nicht von java.util.ArrayList. Das an sich ist nicht das Problem, aber wenn sie nicht erbt, musst du selbst dafür sorgen, dass du das Interface Iterable (das z.B. von einer java.util.ArrayList implementiert wird), implementierst.

Iterable (Java Platform SE 6)


----------



## Marcinek (30. Okt 2010)

Ich muss ein wenig korrigieren:

Die Lösung liegt in erster Line nicht dadrin von einer Klasse zu erben, die bereits Iterable implementiert, sondern direkt das Interface zu implementieren.

In ArrayList wird Iterable über den internen Array gebogen. Deine Klasse hat aber i.d.R. dann eine eigene intere Struktur.

---

Du schreibst hinter jeder deiner Klassen ein <E> bei dem Test verwendest du es aber nicht ;D

Hoffe du weißt, wie man damit umgeht ^^


----------



## Haave (30. Okt 2010)

Marcinek hat gesagt.:


> Ich muss ein wenig korrigieren:
> 
> Die Lösung liegt in erster Line nicht dadrin von einer Klasse zu erben, die bereits Iterable implementiert, sondern direkt das Interface zu implementieren.


Hm, das hatte ich mit meinem Beitrag eigentlich ausdrücken wollen (war vielleicht irgendwie missverständlich  ).
Also: Es kracht bei deiner Schleife, weil man durch die fehlende Implementierung von Iterable nicht mit Schleifen über Objekte deiner eigenen Klasse drüberlaufen kann. Deshalb musst du Iterable selbst implementieren. Eine andere Möglichkeit wäre (und das kam vielleicht verwirrend in meinem ersten Satz rüber), deine Klasse von ArrayList erben zu lassen, dann sollte Iterable bereits implementiert sein. Das ist aber wie gesagt kein Muss, und wenn du eine solche Listenklasse selbst schreiben willst, ist es vielleicht auch ganz gut, wenn du alles von Hand implementierst


----------



## Sophie (30. Okt 2010)

Danke für die Antworten.
Leider verstehe ich nicht so ganz, wie das funktionieren soll.
Könnt Ihr mir bitte weiterhelfen?


----------



## timbeau (30. Okt 2010)

Du kannst auch mittels for-Schleife und array.get(index) die Elemente ausgeben.

Dein Problem hier ist aber, dass du dir Galileo Computing :: Java ist auch eine Insel – 12.2 Mit einem Iterator durch die Daten wandern mal anschauen musst.


----------



## Final_Striker (30. Okt 2010)

Sophie hat gesagt.:


> Danke für die Antworten.
> Leider verstehe ich nicht so ganz, wie das funktionieren soll.
> Könnt Ihr mir bitte weiterhelfen?



Ich würde an deiner Stelle einfach noch eine Methode getElementAt( int i ) hinzufügen, die dir das Element an der Stelle i liefert. Dann kannst du die Liste mit einer normalen for-Schleife ausgeben.


----------



## Sophie (30. Okt 2010)

So, ich hab mir das jetzt alles mal durchgelesen und habe meinene Testklasse abgeändert.
Jetzt gibt es aber ein Problem mit der Methode iterator()
Wisst Ihr, warum das nicht funktioniert?


```
import java.util.ArrayList;
import java.util.Iterator;


public class MeineArrayListTest<E> {
 
	public static void main(String[] args) {

		MeineArrayList<String> ms = new MeineArrayList<String>(5, 3);

		ms.add("1");
		ms.add("2");
		ms.add("3");
		ms.add("4");
		ms.add("5");

		Iterator itr = ms.iterator();

		while (itr.hasNext())
			System.out.println(itr.next());
	}
}
```


----------



## gman (30. Okt 2010)

Hi,

du musst die Methode "iterator" natürlich auch in deiner Array-Klasse implementieren. Und zwar nicht
einfach nur die Methode da reinbasteln, sondern die Klasse muss auch das Interface "Iterable" implementieren,
wie dir Marcinek und Haave schon gesagt haben.


```
public class MyClass implements EinInterface {

   public void nameDerMethodeDieVomInterfaceDefiniertWird() {
        //deine Implementierung
   }
```


----------



## XHelp (30. Okt 2010)

Zumal dein Test auch falsch ist: Du erstellst eine angeblichListe von Strings, gehst mit der Schleife über jeden Integer-Wert um dann letztendlich das Objekt der Gesamtliste auszugeben... Also 2/3 Sachen sind fehl am Platz.


----------



## Tester (30. Okt 2010)

Ich habe ein ähnliches Problem ! 

[Java]
package lottoprog;

import java.sql.*; 
import java.sql.DriverManager;
import java.util.*;
public class lottodb {
private	static Connection con = null;
private static ArrayList<lottozahl>tab=new ArrayList<lottozahl>();
private static ArrayList<lottozahl>tabt;
private static ResultSet rs;
private static lottozahl tabr=new lottozahl();
private static int[] tabz=new int[7];
private static int i=0,k=0; 
private static boolean b;
	public static  ArrayList<lottozahl>gettable(){
	   try 
	    { 
	      Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver" ); 
	      //Class.forName( "org.hsqldb.jdbcDriver" ); 
		   //Class.forName( "com.company.DBDriver");
	    } 
	    catch ( ClassNotFoundException e ) 
	    { 
	      System.err.println( "Keine Treiber-Klasse!" ); 
	      e.printStackTrace(); 
	      return null; 
	    } 

	    try 
	    { 
	      con = DriverManager.getConnection("jdbcdbc:lottodb");

	      //con = DriverManager.getConnection(  "jdbc:hsqldb:file:lottodb", "sa", "" ); 
	     //con = DriverManager.getConnection( "jdbcdbcriver={Microsoft Access Driver Zeilen-Umbruch (*.mdb)};DBQ=d:/Bernd_lotto1.mdb", "name", "pass" );
	     Statement stmt = con.createStatement(); 
//	      stmt.executeUpdate( "INSERT INTO CUSTOMER VALUES(50,'Christian',Zeilen-Umbruch  'Ullenboom','Immengarten 6','Hannover')" ); 

	       rs = stmt.executeQuery( "SELECT * FROM Lotto_Zahlen_gesamt" ); 

	      while ( rs.next() ){ 
	        //System.out.println( rs.getString(1)+" "+ rs.getString(2)+" "+ rs.getString(3)+" "+rs.getString(4)+" "+ rs.getString(5)+" "+rs.getString(6)+" "+rs.getString(7)+" "+ rs.getString(8)+" "+rs.getString(9)+" "+rs.getString(10)+" "+ rs.getString(11)+" "+rs.getString(12) ); 
            // Ziehungsnummer einlesen
	      tabr.set(0,rs.getInt(1));
          // Jahr einlesen
	      tabr.set(1,rs.getInt(3));
          // Wochenzahl einlesen
	      tabr.set(2,rs.getInt(4));
          // Datum Einlesen
	      tabr.set(0,rs.getString(2));
	      //Wochentag einlesen
          tabr.set(1,rs.getString(5));
          // Lottozahlen einlesen
          for (i=0;i<7;i++)
          tabz_=rs.getInt(6+i);
          tabr.set(tabz);
          // Ziehungsdaten in Tabelle einfügen
          tab.add((tab.size()),tabr);
          System.out.println(tabr.get(0)+" "+b+" "+tab.get(k).get(0));
	   k++;
	      }
	      rs.close(); 

	      stmt.close(); 
	    } 
	    catch ( SQLException e ) 
	    { 
	      e.printStackTrace(); 
	    } 
	    finally 
	    { 
	      if ( con != null ) 
	        try { con.close(); } catch ( SQLException e ) { e.printStackTrace(); } 
	    } 
	    for (i=0;i<=(tab.size()-1);i++){
	    System.out.println(tab.get(i).get(0)+" "+i);	
	    }
	    return tab;
 }
public static void main(String args[]){
tabt=gettable();
tabt.remove(tabt.size()-1);
for (i=0;i<=(tabt.size()-2);i++){
 tabr=tabt.get(i);
 System.out.println(tab.get(i).get(0)+" "+i+" "+tabr.get(1));
}
}
}
[/Java]
Beim erstem Aufruf liest der noch Normal die Elemente. Bei den weiteren immer nur das letze. Egal an welcher Stelle ich mit 
"get(x)"  die lese. 

Kann mir hierzu jemand weiterhelfen?_


----------



## XHelp (30. Okt 2010)

Öhm, durch eine kreative Formatierung und vielsagende Namen (tab,tabz,tabr,tabt) lässt sich natürlich rein gar nichts erkennen.
Es könnte aber sein dass bei der Schleife in Zeile 53 die geschweiften Klammer fehlen... mach dir Debugausgaben rein, dann wirst du sehen wo was schiefläuft.


----------



## Tester (30. Okt 2010)

Zeile 53 funktiniert. In Zeile 75 und 84 wird nur das letzte Element ausgegeben. 

????


----------



## XHelp (30. Okt 2010)

Wie gesagt, mach den Code lesbar und stell ein KSKB rein.


----------



## Tester (31. Okt 2010)

Ich welcher Hinsicht soll ich den Code lesbar machen ? 
Was ist KSKB ?


----------



## XHelp (31. Okt 2010)

Lesbarer im Sinne, dass man verstehen kann, was da passiert. Die ganzen Variablen sind ziemlich nichtssagend und gleichaussehend. KSKB ist ein kurzes selbsträndiges kompilierbares Beispiel. So dass man es rüber kopieren kann und selber ausprobieren kann. Ohne Datenbank, mit fehlenden Klassen (deren Namen übrigens groß geschrieben werden) etc.


----------



## Tester (31. Okt 2010)

Ich hab das Problem! 

In Zeile 41 muss stehen 
[Java]
tab=new ArrayList<lottozahl>();
[/Java]
;-)


----------

