[Java] Array - Klassenmember(?)

12/28/2014 18:06 The_Dentist#1
Hey,

Ich habe folgendes Problem und zwar soll ich zwei Klassen schreiben.

Einmal eine "Singer" und einmal eine "Coach" Klasse. Beide Klassen haben ihre Attribute und Methoden.

Nun soll ich der Coach Klasse eine Methode hinzufügen, mit der es möglich ist, Sänger (also Objekte von Singer) einem Array vom Typ Singer (Singer[] s = new Singer[x - Länge]) hinzuzufügen, sodass man das Array durchgehen kann und alle Sänger findet, welche dem gleichen Coach zugeordnet sind.

Dieses Array soll sich in der Coach Klasse befinden.

Mein Ansatz sieht derzeit, wie folgt aus:


Ich wusste nicht genau, wie man diese Beziehungen nennt.

Kann mir Jemand bei dem Problem helfen?

Wäre demjenigen sehr dankbar!

LG
The_Dentist!

€DIT: Hat sich erledigt, Lösung des Problemes wurde gefunden!
12/28/2014 18:29 NotEnoughForYou#2
Wieso heißt deine Methode select? Wäre ein Name wie insert nicht passender?

Angenommen du hast deine Klasse Coach:

Code:
class Coach {
	private Singer[] singer = new Singer[20];

	public void insert(Singer s) {
		int pos = getEmptyPos();

		if(pos != -1) {
			singer[pos] = s;
		}
	}

	private int getEmptyPos() {
		for (int i = 0; i < singer.length; i++) {
			if(singer[i] == null) {
				return i;
			}
		}

		return -1; // array voll
	}
}
So in etwa könnte das Einfügen aussehen. Ist allerdings ungetestet.

Dann könntest du sowas wie folgt machen:

Code:
Coach c = new Coach();

c.insert(new Singer());
Und dann für die Ausgabe eben das Array durchgehen.

Schöner wäre es natürlich mit einer Arraylist, aber ich nehme an, ihr müsst Arrays verwenden.
12/28/2014 18:32 The_Dentist#3
Quote:
Originally Posted by NotEnoughForYou View Post
Wieso heißt deine Methode select? Wäre ein Name wie insert nicht passender?
Aufgabenstellung...
Danke schon mal, ich versuche es gerade mal!


€dit:


So:

LG
12/28/2014 19:24 NotEnoughForYou#4
Zeig mal deinen ganzen Code.

Überschreiben doch lieber die toString Methode und gebe es über ein System.out.print aus, ist eleganter
12/28/2014 19:44 The_Dentist#5
[Coach - Klasse]

[Singer - Klasse]


€dit: Leider immer noch keine Lösung.
12/29/2014 20:59 RecK#6
Ein normales Objektarray zu verwenden, wenn dynamisch viele Objekte hinzugefügt werden können ist unsinnig. Die Länge muss vorher festgelegt werden.
Jeder der dann einem mit ReDim-Funktionen kommt, "scheißt" ja ganz schön auf Performance...

0815-Lösung fürs Listing wäre:
Code:
private ArrayList<Singer> customers = new ArrayList<>();

public List<Singer> getAllSingers() {
    return customers;
}

public void addSinger(Singer s) {
   customers.add(s);
}
Was bereits angesprochen wurde ist die Überschreibung der toString Methode. Jede Klasse erbt standardmäßig in Java von der Klasse Objekt, mein ich. Dort gibt es eine toString Methode. Default mäßig gibt die Klasse über toString einen String der das Objekt serialisiert (meist nutzlos) darstellt.

Also zum Überschreiben der Methode ist @Override wichtig.
Implementiere also nun folgendes in deine Coach-Klasse:
Code:
@Override
public String toString() {
   StringBuilder sb = new StringBuilder(coachName); // stringbuilder ist deutlich schneller (besseres stringhandling)
   sb.append(" hat folgende Kunden: ");
   for(Singer s : customers) {
     sb.append("\n");
     sb.append(s.getName()); // oder toString Methode von Singer
   }
   sb.append("Weiterer Text...");
   return sb.toString();
}
Das wäre der vollständige Workaround für diese Problematik.
Hoffe es hilft dir.

#edit:
Deine Main-Methode ist ja soweit immer das Gleiche.
Die Ausabe wäre nun jedoch nur noch:
Coach c = ...
System.out.println(c); // .toString wird automatisch aufgerufen (kann aber auch geschrieben werden, c.toString())


lg, Tim
12/31/2014 01:38 dowhile#7
Das sind Hausaufgaben, und dafür darf er natürlich nicht den vollen Sprachumfang nutzen. Das mit einem Array zu lösen ist in der Praxis natürlich nicht gut, aber hier geht es darum, dass er es trotzdem auch damit lösen kann.
Analog darf er natürlich auch nicht toString() nutzen (bzw. muss wenn dann toString() in ausgabe() aufrufen), sondern muss sich an die Aufgabenstellung halten.
StringBuilder ist nicht schneller, bzw. die manuelle Konkatenation wird vom Compiler optimiert (und ggf. durch einen StringBuilder ersetzt).
"select" ist ein sinnvoller Name, weil ein Coach einen Singer beim Context für sein Team "auswählt".