setter-Methode i.V.m. Array < Java < Programmiersprachen < Praxis < Informatik < Vorhilfe
|
Status: |
(Frage) beantwortet | Datum: | 11:28 Mo 22.10.2012 | Autor: | Marcel08 |
Hallo zusammen!
Ich hätte eine Frage zu Arrays in Java. Und zwar würde ich gerne wissen, wie man eine setter-Methode mit einem String-Array füttern kann. Ausgangslage soll dabei eine getter-Methode sein, die ein String-Array zurückgeben soll. Das Ganze habe ich bisher wie folgt aufgebaut:
package test;
public class Zutaten {
private String[] zutat;
public String[] getZutat() {
return zutat;
}
public void setZutat(String[] zutat) {
this.zutat = zutat;
}
}
Probleme habe ich nun bei der Formulierung der main-Klasse. Nach meiner Idee sollen die einzelnen Zutaten durch die Verwendung einer Schleife nacheinander an die setter-Methode der Klasse Zutaten übergeben und im entsprechenden Attribut gepeichert werden. Anschließend sollen durch einen Aufruf der getter-Methode in der main-Klasse sämtliche Zutaten, die zuvor im Attribut gepeichert wurden, ausgegeben werden. Dabei bereitet mir vor allem die Übergabe des Arrays an die setter-Methode einige Schwierigkeiten. Als Anfänger gelingt es mir nicht, den unteren Quellcode kompilierend zu fertigen. Über hilfreiche Tipps würde ich mich freuen; vielen Dank!
package test;
public class Main {
public static void main(String[] args) {
Zutaten[] zutat = new Zutaten[2];
zutat[0] = "Mehl";
zutat[1] = "Zucker";
for (int i = 1; i < zutat.length; i++) {
zutat[i].setZutat(args);
}
System.out.println("Zutaten: " + zutat[0].getZutat() + ", "
+ zutat[1].getZutat());
}
}
Viele Grüße, Marcel
|
|
|
|
Status: |
(Antwort) fertig | Datum: | 19:19 Mo 22.10.2012 | Autor: | rainerS |
Hallo!
> zutat[0] = "Mehl";
Wie soll das gehen? Rechts steht ein Ausdruck vom Typ String, links vom Type Zutaten.
Ich denke, du meinst
1: | public static void main(String[] args) {
| 2: | Zutaten z = new Zutaten();
| 3: | z.setZutat(args);
| 4: | } |
Viele Grüße
Rainer
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 20:06 Mo 22.10.2012 | Autor: | Marcel08 |
Hallo!
Zunächst einmal vielen Dank für die Antwort.
> Hallo!
>
>
> > zutat[0] = "Mehl";
>
> Wie soll das gehen? Rechts steht ein Ausdruck vom Typ
> String, links vom Type Zutaten.
Ja, mir ist der Fehler bewusst. Eclipse meldet an dieser Stelle auch einen Kompilierungsfehler. Ich wusste aber nicht, wie ich meine Idee anders darstellen sollte.
> Ich denke, du meinst
>
> 1: | public static void main(String[] args) {
| 2: | > Zutaten z = new Zutaten();
| 3: | > z.setZutat(args);
| 4: | > } |
Hier wird dann ja aber kein Array verwendet. Wie gesagt, die feste Ausgangslage des Problems ist die vorhandene getter-Methode
public String[] getZutat() {return zutat;}
in der Klasse Zutaten. Wenn ich das Ganze dann rückwärts betrachte, brauche ich ja zunächst ein Attribut
private String[] zutat;
in dem das Array durch die setter-Methode abgespeichert wird. Die getter-Methode soll dann den Inhalt des Attributs an den Methodenaufruf in der main-Klasse senden. Diesbezüglich brauche ich dann eine setter-Methode
public void setZutat(String[] zutat) {
this.zutat = zutat;
}
die den ihr übergebenen Inhalt im Attribut ablegt. Das bedeutet aber, dass sie zuvor den Parameter
String[] zutat
übergeben bekommen muss. Daher würde ich in der Klasse Main zunächst die folgende Objekterzeugung durchführen
Zutaten[] zutat = new Zutaten[2];.
Eclipse gibt dabei auch grünes Licht (oder zumindest kein rotes). An dieser Stelle setzt dann mein Problem an. Diesbezüglich beschäftigen mich momentan die folgenden Fragen:
(1.) Wie kann ich nun den Arraypositionen [0] und [1] beispielsweise die Zutaten Mehl und Zucker zuweisen?
(2.) Wie kann ich diese beiden Zutaten dann der setter-Methode aus der Klasse Zutaten übergeben?
(3.) Abschließend würde ich gerne durch den Aufruf der setter-Methode in der Klasse Main die beiden Zutaten im Ausgabefenster angezeigt bekommen.
Viele Grüße, Marcel
|
|
|
|
|
Hallo Marcel,
also du scheinst hier etwas durcheinander zu bringen.
Du solltest in deiner Main Applikation nicht versuchen wieder ein Array zu benutzen, das möchtest du ja innerhalt deiner Zutaten Klasse abbilden und kapseln.
Anbei mal ein Vorschlag wie man das realisieren kann. Ein Vorschlag ist mit ArrayListen und mit Array direkt. Das Problem mit dem Array direkt habe ich auch beschrieben, damit du siehst was da schief geht.
Zuerst einmal die Main Klasse, die die ganzen Aufrufe enthält:
//=============================================================================
1: |
| 2: | public class Main {
| 3: |
| 4: | public static void main(String[] args) {
| 5: | ZutatenListe ZListe = new ZutatenListe();
| 6: |
| 7: | ZListe.setZutaten("Mehl");
| 8: | ZListe.setZutaten("Eier");
| 9: |
| 10: | String[] ZStringArray = ZListe.getZutaten();
| 11: |
| 12: | for(int i=0; i < ZStringArray.length; i++) {
| 13: | System.out.println(ZStringArray[i]);
| 14: | }
| 15: |
| 16: | ZutatenArray ZArray = new ZutatenArray();
| 17: |
| 18: | ZArray.setZutaten("Butter");
| 19: | ZArray.setZutaten("Milch");
| 20: |
| 21: | String[] ZArrayStringArray = ZArray.getZutaten();
| 22: |
| 23: | for(int i=0; i < ZArrayStringArray.length; i++) {
| 24: | if(ZArrayStringArray[i] != null)
| 25: | System.out.println(ZArrayStringArray[i]);
| 26: | }
| 27: |
| 28: | }
| 29: |
| 30: | }
|
//=============================================================================
1: |
| 2: | import java.util.ArrayList;
| 3: |
| 4: | public class ZutatenListe {
| 5: | // Dynamische Struktur. Vorteil gegenüber Array ist, das man vorher die
| 6: | // Größe noch nicht wissen muss.
| 7: | private ArrayList<String> meineZutaten = new ArrayList<String>();
| 8: |
| 9: | public String[] getZutaten() {
| 10: | // Generiert ein Array aus der ArrayListe.
| 11: | String[] itemArray = new String[this.meineZutaten.size()];
| 12: |
| 13: | return this.meineZutaten.toArray(itemArray);
| 14: | }
| 15: |
| 16: | public void setZutaten(String Zutat) {
| 17: | // Ein weiteres Element in die Liste hinzufügen.
| 18: | this.meineZutaten.add(Zutat);
| 19: | }
| 20: | }
|
//=============================================================================
1: |
| 2: | public class ZutatenArray {
| 3: | private String[] meineZutaten = new String[100];
| 4: | private int counter = 0;
| 5: |
| 6: | public String[] getZutaten() {
| 7: | return this.meineZutaten;
| 8: | }
| 9: |
| 10: | public void setZutaten(String Zutat) {
| 11: | // Zutat ins Array hinzufügen.
| 12: | this.meineZutaten[this.counter] = Zutat;
| 13: | // Merken an welcher Stelle das letzte mal etwas hinzufgefügt wurde.
| 14: | this.counter++;
| 15: | }
| 16: | }
|
//=============================================================================
Liebe Grüße, Wolfgang.
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:45 Di 23.10.2012 | Autor: | Marcel08 |
Hallo WolfgangF!
Vielen Dank für deine ausführliche Antwort. Das hat mir sehr geholfen, sodass meine Frage nun beantwortet ist.
Viele Grüße, Marcel
|
|
|
|
|
Status: |
(Frage) beantwortet | Datum: | 23:36 Mo 22.10.2012 | Autor: | Marcel08 |
Hallo nochmal!
Ich versuche es noch einmal anders zu erklären. Der folgende Code kompiliert und liefert auch das gewünschte Ergebnis:
[Dateianhang nicht öffentlich]
[Dateianhang nicht öffentlich]
Allerdings macht diesbezüglich die Klasse Zutaten natürlich so keinen Sinn, da sie überhaupt nicht verwendet wird. Wie kann man nun aber die Klasse Zutaten und deren Methoden sinnvoll miteinbeziehen und ggf. erweitern? Diesbezüglich sollte der Array-Charakter der getter-Methode
public String[] get Zutat() {return zutat;}
beibehalten werden. Nochmals vielen Dank!
Viele Grüße, Marcel
Dateianhänge: Anhang Nr. 1 (Typ: PNG) [nicht öffentlich] Anhang Nr. 2 (Typ: PNG) [nicht öffentlich]
|
|
|
|
|
Hallo!
Irgendwie ist wohl nicht ganz klar, wo das Problem ist. Ausgehend von deinem Beispiel mit den Strings würde ich das so umbauen:
Zutaten[] z=new Zutaten[2]
z[0]=new Zutaten()
z[0].SetZutat("Mehl")
z[1]=new Zutaten()
z[1].SetZutat("Zucker")
system.out.println( z[0].GetZutat() )
Der unterschied liegt nur darin, daß man die String-Klasse direkt mit einem Wert initialisieren kann, während man deine Klasse erst mal initialisiert, und in einer zweiten Anweisung den Wert setzt. Ähnliches gilt bei der Ausgabe. Der Aufruf der Stringklasse selbst fürht dazu, daß sie ihren Wert ausgibt, deine Klasse hat dazu aber ne Getter-Methode.
|
|
|
|
|
Status: |
(Frage) reagiert/warte auf Reaktion | Datum: | 11:27 Di 23.10.2012 | Autor: | Marcel08 |
Hallo!
Nochmals vielen Dank für die Beteiligung.
> Hallo!
>
> Irgendwie ist wohl nicht ganz klar, wo das Problem ist.
> Ausgehend von deinem Beispiel mit den Strings würde ich
> das so umbauen:
>
> Zutaten[] z=new Zutaten[2]
> z[0]=new Zutaten()
> z[0].SetZutat("Mehl")
> z[1]=new Zutaten()
> z[1].SetZutat("Zucker")
>
>
> system.out.println( z[0].GetZutat() )
Wenn ich das so versuche zu realisieren, erhalte ich die folgenden Kompilierungsfehler:
[Dateianhang nicht öffentlich]
[Dateianhang nicht öffentlich]
Eclipse möchte dann, dass ich in der Parameterliste der setter-Methode der Klasse Zutaten String[] zutat in String string umändere. Dann müsste ich aber auch das Attribut und damit auch die getter-Methode abändern. Der Rückgabewert String[] der getter-Methode soll aber nicht verändert werden.
> Der unterschied liegt nur darin, daß man die String-Klasse
> direkt mit einem Wert initialisieren kann, während man
> deine Klasse erst mal initialisiert, und in einer zweiten
> Anweisung den Wert setzt. Ähnliches gilt bei der Ausgabe.
> Der Aufruf der Stringklasse selbst fürht dazu, daß sie
> ihren Wert ausgibt, deine Klasse hat dazu aber ne
> Getter-Methode.
Ja, dessen bin ich mir bewusst.
Viele Grüße, Marcel
Dateianhänge: Anhang Nr. 1 (Typ: PNG) [nicht öffentlich] Anhang Nr. 2 (Typ: PNG) [nicht öffentlich]
|
|
|
|
|
Status: |
(Mitteilung) Reaktion unnötig | Datum: | 17:46 Di 23.10.2012 | Autor: | Marcel08 |
Das Anliegen hat sich erledigt, vielen Dank!
|
|
|
|