Interface Iterable<T> über Array

mutoki

Mitglied
Hallo,

ich wollte euch um Hilfe bitten.
Und zwar hab ich demnächst ne Prüfung in Java und mache zur Vorbereitung gerade alte Aufgaben durch. Bei einer Aufgabe komm ich allerdings nicht weiter. Ich schreib euch mal die Aufgabenstellung hin:

Erweitern Sie das Programm:
Die Klasse Liedsammlung soll das Interface Iterable<T>implementieren.

  • Erweitern dazu Sie die Klasse Liedsammlung um die Methode Iterator< T > iterator(); Der Iterator soll der Reihe nach alle Lieder des Arrays lieder liefern.

  • Sehen Sie die Klasse Liedsammlung, unter Verwendung von Generics als universell einsetzbare Klasse für eineCollection vor. D.h. Sie soll nicht nur Mp3 Instanzen verarbeiten können, sondern Instanzen von Klassen, die imgenerischen Datentyp gegeben sind.

Java:
import java.util.Iterator;
class Mp3 {
  String title;
  String interpret ;
  Mp3(String t, Stringi n) {
    title=t ;interpret = in;
  }
  void play() {
    System.out.println(title +" : "+ interpret) ; // ...   spielt das Lied ab
  }
}

class Liedsammlung
{
  Mp3 lieder[] ;
  Liedsammlung (Mp3 x[]) {
    lieder=x ;
  }



}

public class Mp3Player {
  public static void main (String args [ ]) {
    Mp3 lieder[] =new Mp3[100];
    for (int i =0; i<lieder.length; i ++) { / / belegen der Lieder der Liedsammlung
      lieder[i]=new Mp3("name"+i ,"interpret"+i);
    }
    Liedsammlung m=new Liedsammlung (lieder);
    / / hier mit Iterator Lieder einmalig der Reihe nach abspielen

}

Bei verketteten Listen hab ichs hinbekommen, aber mit Arrays schaff ichs nicht.
Folgendes hab ich bis jetzt:
[JAVA=13]class Liedsammlung<T> implements Iterable<T>[/code]
[JAVA=30]Liedsammlung<Mp3> m=new Liedsammlung<Mp3>(lieder);
for(Mp3 f:m){
System.out.println(f.interpret);
System.out.println(f.title);
}[/code]

Ich weiß allerdings nicht wie die Methode "Iterator<T> iterator()" ausschauen soll.
Würde mich freuen wenn ihr mir helfen könntet
 
F

Firephoenix

Gast
schau dir dazu mal das Interface hier an:
Iterator (Java Platform SE 6)

du musst next() und hasNext() so implementieren, dass es auf deine Datenstruktur passt, dann kann jemand anderes sich über die iterator() Methode deinen Iterator holen und nur mit den 2 Methoden über deine MP3 (oder generische) Datenstruktur laufen.

Gruß
 
N

nillehammer

Gast
du musst next() und hasNext() so implementieren, dass es auf deine Datenstruktur passt, dann kann jemand anderes sich über die iterator() Methode deinen Iterator holen und nur mit den 2 Methoden über deine MP3 (oder generische) Datenstruktur laufen.
Die remove()-Methode nicht vergessen! Gerade bei einem Array ist die nämlich etwas knifflig, weil man da umkopieren muss.

Den fertigen Code für Deinen Anwendungsfall gibt es übrigens schon. Die ArrayList benutzt intern nämlich einen Array für das Speichern der Elemente und implement auch Iterable<E>. Der spannende Code versteckt sich in der Klasse ArrayList$Itr. Den SourceCode kannst Du Dir i.d.R. über Deine IDE anschauen. Die hat ja das JDK mit dem Source-Code eingebunden. Ansonsten gibt's den auch online: java.util: ArrayList.java (ab Zeile 780). Als Ansatz für eigenen Code oder zum Nachvollziehen ist das bestimmt recht brauchbar.
 

Landei

Top Contributor
Die remove()-Methode nicht vergessen! Gerade bei einem Array ist die nämlich etwas knifflig, weil man da umkopieren muss.

Wenn es nicht explizit gefordert ist, würde ich das nicht implementieren, sondern stattdessen eine
Code:
UnsupportedOperationException
werfen (was laut Doc ja auch erlaubt ist).
 
N

nillehammer

Gast
Wenn es nicht explizit gefordert ist, würde ich das nicht implementieren, sondern stattdessen eine
Code:
UnsupportedOperationException
werfen (was laut Doc ja auch erlaubt ist).
Ja, wenn ich so drüber nachdenke, macht das für diesen Fall sehr viel Sinn. Der Aufgabensteller war sich bestimmt nicht der ganzen Fallstricke (concurrent modifiaction, Umkopieren bei remove etc.) bewusst, als er mal so lapidar geschrieben hat: "Mach mal was mit einem Array im Hintergrund Iterable." Wenn das nämlich so leicht wäre, hätten die Java-Jungs schon in Java selbst Arrays Iterable implementieren lassen (mit Ausnahme von primitiven Arrays natürlich, da geht's ja sowieso nicht generisch).
 

mutoki

Mitglied
Ich denke ich habs jetzt hinbekommen:

Java:
import java.util.Iterator;

class Mp3 {
	String title;
	String interpret;
	Mp3(String t, String in){
		title=t;
		interpret=in;
	}
	void play(){
		System.out.println(title+":"+interpret);
	}
}

class Liedsammlung<GenT> implements Iterable<GenT>{
	Mp3 lieder[];
	Liedsammlung(Mp3 x[]) {
		lieder=x;
	}
	private class Lilterator implements Iterator<GenT>{
		GenT array[];
		int pos=0;
		public boolean hasNext() {return pos<array.length;}
		public GenT next() {return array[pos++];}
		public void remove() {/*dummy*/}		
	}
		
	public Iterator<GenT> iterator() {
		return new Lilterator();
	}
}

public class Mp3Player {
	public static void main(String args[]) {
		Mp3 lieder[] = new Mp3[100];
		
		for (int i=0;i<lieder.length;i++){
			lieder[i]=new Mp3("name"+i,"interpret"+i);
		}
		Liedsammlung<Mp3> m = new Liedsammlung<Mp3>(lieder);
		for(Mp3 t:m.lieder){
			t.play();
		}
	}
}
 
Zuletzt bearbeitet:

Landei

Top Contributor
[c]public void remove() {/*dummy*/} [/c] ist schlecht, denn die Methode "lügt" - sie tut nicht das, wofür sie eigentlich da ist. Erfahrungsgemäß führt das zu sehr, sehr schwer zu entdeckenden Fehlern.

Die Dokumentation von Iterator empfielt ausdrücklich, in diesem Fall eine [c]UnsupportedOperationException[/c] zu werfen.
 

xehpuk

Top Contributor
Ich denke ich habs jetzt hinbekommen:
Nein, dein Code erfüllt keine der beiden Aufgaben.

Dein Iterator (welchen du nicht mal nutzt) schmeißt immer eine NullPointerException, weil er nicht mit dem Array der Liedsammlung arbeitet, sondern mit einem eigenen mit null initialisierten.

Die Liedsammlung nimmt weiterhin nur Mp3-Arrays an.
 

Neue Themen


Oben