Rückgabe Array

  • Themenstarter Themenstarter Ro0kie
  • Beginndatum Beginndatum
R

Ro0kie

Gast
Liebes Java-forum.org! 🙂

Ich habe folgendes Problem undzwar gibt meine Methode
Code:
zuArray()
ein Array als Rückgabetyp zurück,wie euch wahrscheinlich bekannt ist funktioniert folgender Code-Schnippsel nicht:

Java:
testarray2 = stapel.zuArray();

Wie kriege ich nun die Werte des Arrays in mein Testarray ?, ich würde mal schaätzen mit einer For-schleife aber wie ?

Danke im vorhinein. 🙂

MfG Ro0kie 😉
 
Zuletzt bearbeitet von einem Moderator:
> wie euch wahrscheinlich bekannt ist funktioniert folgender Code-Schnippsel nicht:

wieso sollte das bekannt sein? und was geht nicht? komplette Klassen/ Programme + Fehlermeldungen posten

und die Speicherung des Arrays in einer Variablen ist zwingend erforderlich,
danach kannst du wenn nötig in ein anderes Array kopieren, wie man das eben so mit Schleifen macht

hast du irgendwelche Kenntnisse zu Arrays und Schleifen, kannst du z.B. den Inhalt eines Arrays per Schleife ausgeben?
 
hast du irgendwelche Kenntnisse zu Arrays und Schleifen, kannst du z.B. den Inhalt eines Arrays per Schleife ausgeben?
ja kann ich, Kenntnisse sind auch vorhanden.

Klasse MyQueue
Java:
import java.util.ArrayList;

/**
 * Klasse, die ähnlich wie eine ArrayList arbeitet,
 * jedoch nur erlaubt am Anfang ein Element hinzuzufügen und am Ende ein Element weg zu nehmen.
 * 
 * @author Martin S
 * @version 2011-05-14
 */
public class MyQueue extends ArrayList{ //Klasse erbt von ArrayList um sich die vielen Objekt zu ersparen.
	
	private ArrayList<String> arraylist;
	
	/**
	 * Konstruktor,welcher eine leere ArrayList initialisiert.
	 *  
	 */
	public MyQueue(){
		this.arraylist = new ArrayList<String>();
	}
	
	/**
	 * Methode zum hinzufügen einzelner Elemente an erster Stelle der ArrayList.
	 * 
	 * @param element String, welches in die Arraylist an erster Stelle hinzugefügt wird. 
	 */
	public void hinzufügen(String element){
		this.add(0,element);
	}
	
	/**
	 * Methode zum entfernen einzelner Elemente an letzter Stelle der ArrayList.
	 * 
	 */
	public void entfernen(){
		this.remove(arraylist.size());
	}
	
	/**
	 * Methode,welche mit Hilfe der toArray-Methode ein Array der ArrayList zurück gibt.
	 * 
	 * @return elemente
	 */
	public String[] zuArray(){
		String[] elemente = (String[]) this.toArray();
		 return elemente;
	}
	
	
	
}


Klasse MyStack
Java:
import java.util.ArrayList;

/**
 * Klasse, die ähnlich wie eine ArrayList arbeitet,
 * jedoch nur erlaubt am Ende ein Element einzufügen und am Ende ein Element weg zu nehmen.
 * 
 * @author Martin S
 * @version 2011-05-14
 */
public class MyStack extends ArrayList { //Klasse erbt von ArrayList um sich die vielen Objekt zu ersparen.
	
	private ArrayList<String> arraylist;
	
	/**
	 * Konstruktor,welcher eine leere ArrayList initialisiert.
	 *  
	 */
	public MyStack(){
		this.arraylist = new ArrayList<String>();
	}
	
	/**
	 * Methode zum hinzufügen einzelner Elemente an letzer Stelle der ArrayList.
	 * 
	 * @param element String, welches in die Arraylist an letzter Stelle hinzugefügt wird. 
	 */
	public void hinzufügen(String element){
		this.add(arraylist.size(),element);
	}
	
	/**
	 * Methode zum entfernen einzelner Elemente an letzter Stelle der ArrayList.
	 * 
	 */
	public void entfernen(){
		this.remove(arraylist.size());
	}
	
	/**
	 * Methode,welche mit Hilfe der toArray-Methode ein Array der ArrayList zurück gibt.
	 * 
	 * @return elemente 
	 */
	public String[] zuArray(){
		 String[] elemente = (String[]) this.toArray();
		 return elemente;
	}

}

Klasse MyArrayListTest:
Java:
/**
 * Testklasse für die Klassen MyQueue und MyStack.
 * 
 * @author Martin S
 * @version 2011-05-14
 */
public class MyArrayListTest {
	public static void main (String[] args){
		
		// Objekter der beiden Klassen erzeugen
		MyQueue warteschlange = new MyQueue();
		MyStack stapel = new MyStack();
		
		String[] testarray1 =new String[warteschlange.size()];
		String[] testarray2 =new String[stapel.size()];
		
		//Befüllen der ArrayList's
		for(int i=0;i <10;i++){
			stapel.hinzufügen(""+i);
			warteschlange.hinzufügen(""+i);
		}
		
		//ArrayList umwandeln in Array
		testarray1 = warteschlange.zuArray();
		testarray2 = stapel.zuArray();
		
		//Ausgeben der Testarrays
		for(int j =0;j<testarray1.length;j++){
			System.out.print("" + testarray1[j]);
			System.out.print("" + testarray2[j]);	
		}
	}
}



Fehlermeldung:
Code:
Exception in thread "main" java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to [Ljava.lang.String;
	at MyQueue.zuArray(MyQueue.java:45)
	at MyArrayListTest.main(MyArrayListTest.java:24)
 
Die Methode toArray liefert dir ein Object-Array zurück, das kannst du nicht einfach zu einem String-Array casten!
Es gibt aber noch eine weitere überladene Methode die du nutzen kannst
http://download.oracle.com/javase/6/docs/api/java/util/ArrayList.html#toArray%28T[]%29

Deine zuArray-Methoden musst du also anpassen
Java:
String[] elemente = (String[]) this.toArray(new String[]{});

Wenn du bei deiner Liste auch Generics verwenden würdest, wäre auch der Cast hier unnötig! (verstehe eh nicht wieso du da quasi zwei ArrayListen hast (this + arraylist)
 
ja kann ich, Kenntnisse sind auch vorhanden.
unbeachtet der bereits genannten Lösungen zu deinem Code, wieso fragst du dann wie man Arrays kopiert?
denke für dieses Einzelproblem doch etwas nach,
Code hast du hier als Antwort auf meine Frage direkt nicht gepostet, aber in der allgemeinen Menge sehe ich:
Java:
 for(int j =0;j<testarray1.length;j++){
     System.out.print("" + testarray1[j]);
     System.out.print("" + testarray2[j]);   
 }
eine Schleife über den Index, Arrayzugriff mit [index], was spricht gegen einen Schleifeninhalt
Java:
 for(int j =0;j<testarray1.length;j++){
     testarray1[j] = testarray2[j];   
 }
?
du siehst, Array-Kopieren mit Schleife ist eine ganz einfache Sache,
noch schöner ist es wenn man selber darauf kommt, Konzentration + Ausprobieren, das sind noch einfache Themen!
 
edit:
Ich nehms zurück 😉
Ich hätte mir mal anschauen sollen was du realisieren willst (Stack, Queue)

Soll deine ArrayList nur Strings aufnehmen?
Dann benutze Generics. Einfach mal nach Collection und Generics googlen.
 
Zuletzt bearbeitet:
Also ich hab die Testklasse jz nochmal geändert bzw. die Anwesiung von eRaaaa befolgt aber komischer weise entfernt er mir das letzte Element nicht :bahnhof:

Java:
/**
 * Testklasse für die Klassen MyQueue und MyStack.
 *
 * @author Martin S
 * @version 2011-05-14
 */
public class MyArrayListTest {
	public static void main (String[] args){

		// Objekter der beiden Klassen erzeugen
		MyQueue warteschlange = new MyQueue();
		MyStack stapel = new MyStack();

		String[] testarray1 =new String[warteschlange.size()];
		String[] testarray2 =new String[stapel.size()];

		//Befüllen der ArrayList's
		for(int i=0;i <10;i++){
			stapel.hinzufügen(""+i);
			warteschlange.hinzufügen(""+i);
		}

		//ArrayList umwandeln in Array
		testarray1 = warteschlange.zuArray();
		testarray2 = stapel.zuArray();

		//Ausgeben des Testarrays1
		for(int j =0;j<testarray1.length;j++){
			System.out.println("" + testarray1[j]);
		}
                System.out.println("");


                //Ausgeben des Testarrays2
		for(int j =0;j<testarray2.length;j++){
			System.out.println("" + testarray2[j]);
		}
                System.out.println("---------------------------"); // Trennzeile

                //Entfernen eines Elementes
                stapel.entfernen();
                warteschlange.entfernen();

                //Ausgeben der Testarrays nach entfernen eines Elementes

                // Testarrays1
		for(int j =0;j<testarray1.length;j++){
			System.out.println("" + testarray1[j]);
		}
                System.out.println("");

                //Testarrays2
		for(int j =0;j<testarray2.length;j++){
			System.out.println("" + testarray2[j]);
		}
	}
}

Irgendwelche Ideen ?
 
Irgendwelche Ideen ?

Die wurden dir schon ans Herz gelegt. Du hantierst dort mit zwei verschiedenen ArrayListen jeweils rum. Einmal this(du erweiterst ArrayList!, wieso?) und eben die ArrayList
Code:
arraylist
!

Aber das Problem ist noch ein anderes. Nach dem Entfernen, musst du natürlich dir dann die Arrays erneut holen! Du gibst ja danach weiterhin die alten aus!
Also nach
Java:
		// Entfernen eines Elementes
		stapel.entfernen();
		warteschlange.entfernen();

noch mal

Java:
		// ArrayList umwandeln in Array
		testarray1 = warteschlange.zuArray();
		testarray2 = stapel.zuArray();

Aber überdenke das mit deinen Listen nochmal, das Erweitern von ArrayList ist eig. nicht notwendig, genau genommen sogar falsch 🙂
 
Die wurden dir schon ans Herz gelegt. Du hantierst dort mit zwei verschiedenen ArrayListen jeweils rum. Einmal this(du erweiterst ArrayList!, wieso?) und eben die ArrayList
Code:
arraylist
!

Also das ist eine Hausaufgabe unseres APR-Schulfach's (Angewandtes Programmieren). Vieleicht wirds verständlicher wenn ich die Angabe einmal poste 😉 :

Erstelle eine Klasse MyQueue, die ähnlich wie eine ArrayList arbeitet, jedoch nur erlaubt am Anfang ein Element einzufügen und am Ende ein Element weg zu nehmen. Realisiere diese Klasse mittels eines Attributes vom Typ ArrayList.

Erstelle eine Klasse MyStack, die ähnlich wie eine ArrayList arbeitet, jedoch nur erlaubt am Ende ein Element einzufügen und am Ende ein Element weg zu nehmen. Realisiere diese Klasse mittels eines Attributes vom Typ ArrayList.

Erstelle für beide Klassen folgende Methode:

Konstruktor, der eine leere ArrayList erzeugt.
add-Methode, die ein Objekt hinzufügt
remove-Methode, die ein Element entfernt und dieses zurück gibt.
toArray-Methode, die alle Elemente als Objekt-Array zurück gibt.


Erstelle eine Testklasse, die obige Klassen ausreichend testet.Beachte alle Sonderfälle!
[/QOUTE]

By the way hier die Ausgabe :
myarraylist.jpg


Hab ich irgendeinen Sonderfall vergessen ?
 
Zuletzt bearbeitet von einem Moderator:
Naja, da steht eben nichts davon dass du ArrayList erweitern sollst, sondern einfach ganz normal die normale ArrayList verwenden sollst, eben als Attribut, so wie du es auch schon hast.
Java:
public class MyStack extends ArrayList { //Klasse erbt von ArrayList um sich die vielen Objekt zu ersparen.

dass da steht aber nicht so im Text. Und wenn ich mir den Kommentar anschaue, scheinst du auch nicht richtig verstanden zu haben was
Code:
extends
bedeutet, bzw wo/wie/wann man das genau einsetzt oder?
 
Realisiere diese Klasse mittels eines Attributes vom Typ ArrayList.
Das hab ich ja gemacht mit
Code:
private ArrayList<String> arraylist;

und wenn ich jz die Methoden der Klasse ArrayList verwende die ich durch Vererbung bekomme kann ich ja nicht diese spezifischen Begrenzungen für Queue und Stack setzen.

Oder wie hättest du das gemeint ?
 
Das hab ich ja gemacht mit
Code:
private ArrayList<String> arraylist;
Ja, das schrieb ich ja auch bereits dass das ok war!

und wenn ich jz die Methoden der Klasse ArrayList verwende die ich durch Vererbung bekomme kann ich ja nicht diese spezifischen Begrenzungen für Queue und Stack setzen.

Oder wie hättest du das gemeint ?

Hä? Die ArrayList Methoden bleiben doch gleich, ob du nun this oder arraylist verwendest. Dass du eigene Methoden schreiben sollst, ist klar!
Nochmal: Was ich sagen will ist, das Erweitern von ArrayList(also das extends ArrayList) solltest du überdenken --> weg machen 😀
 
Erstelle ein Objekt und benutze dies in jeder Methode (das du ja auch schon hast...) ... Stichwort: Instanzvariable...
 
Zuletzt bearbeitet:
Wie du meinst mach ich halt für jede Metohde ein Objekt,jetzt hab ichs auch 🙂

???:L Du scheinst es immer noch nicht verstanden zu haben, ich weiß allerdings auch nicht was du dir immer dabei denkst mit "mache ich halt für jede Methode ein Objekt"- ich kann deinen Gedankengang nicht nachvollziehen. Vllt. postest du echt mal den Code den du denkst, vllt verstehe ich dann was du dir dabei denkst.
Aber eig. musst du eben nur alle this`s durch arraylist austauschen und das extends weglassen dann sieht man weiter 😀
 
Ich wusste nicht das mann diese Methode gleich auf das Attribut anwenden kann 🙁 und da ein Objekt ja nur innerhalb von Methoden arbeiten kann...

ist nur blöd weil dann muss ich noch eine extra
Code:
size()-Methode
schreiben..
 
Zuletzt bearbeitet von einem Moderator:
ist nur blöd weil dann muss ich noch eine extra
Code:
size()-Methode
schreiben..

NEEEEEIN! Du kannst die doch von der ArrayList
Code:
arraylist
benutzen! :bahnhof:

edit: ahh es geht dir um die Benutzung außerhalb deiner Klasse, ok!
 
Zuletzt bearbeitet:
Um
Code:
size()
in der Testklasse zu benützen brauch ich ja ein Objekt aber mann kan kein Objekt eines Attributs machen und wenn ich die ArrayList Klasse benutze klappst auch nicht :bahnhof:
 
Hi,

Bsp. für Erweiterung MyQueue mit size:
Java:
public int getMyQueueSize(){
  return deineMyQueueArrayListInstanzVariable.size();
}
 

Neue Themen


Zurück
Oben