Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
hallo!
Ich möchte aus einem Array etwas auslesen lassen
Bsp:
Max Mustermann (31)
Doris Musterfrau (32)
klappt so weit auch aber mein Problem ist das nach der letzten ausgabe auch ein Zeilenumbruch erfolgt, der nicht erfolgen soll.
Wie kann ich den verhindern?
Geht das nur mit einem StringBuilder?
Wenn ja? Wie initialisier ich einen StringBuilder und passe den der String to String ausgabe an?
Es läuft bei allen Varianten darauf hinaus, dass Du beim Iterieren immer schauen musst, ob Du gerade das letzte Element zu fassen hast. D.h. die neue Schreibweise zum Iterieren (die mit dem : ) kannst Du nicht benutzen. Beim Iterieren über Collections machst Du es mit einem Iterator und prüfts mit hasNext, beim Iterieren über Arrays mit einer index Variablen und prüfst, ob sie kleiner length-1 ist. Anhand dessen entscheidest Du dann, ob Du System.out.println oder nur System.out.print aufrufst, +"\n" machst, append("\n"); aufrufst oder wie auch immer Du Deinen output generierst.
und nochmal meine konkrete Frage:
In der letzten Zeile führe ich mit \n einen Umbruch durch aber der erfolgt ja auch bei Ausgabe des letzten Namens...
Wie kann ich das verhindern?
Danke
Nochmal meine Antwort: Du kannst nicht mit der Doppelpunkt-Schreibweise iterieren, weil Du dabei nicht erkennst, ob Du das letzte Element zu fassen hast. Du musst mit einer index-Variablen arbeiten.
[Java]
for (int i=0; i<angestellte.length; i++) {
final Angestellter antestellter = angestellte;
... der ganze Outputkram außer dem letzten +"\n"
// Das letze "\n" nur adden, wenn nicht letztes Element
if (i < angestellte.length-1)
str+= "\n";
}
[/Java]
Immer schön [Java]-Tags benutzen, gell
Was mir in dem Zusammenhang gerad einfällt, nachdem Du das ja in der toString-Methode benutzt, die ja im wesentlichen für Log-ausgaben gedacht ist, schau Dir mal commons-lang von Apache an und benutze deren ToStringBuilder. Der erzeugt eine Ausgabe, die mehr oder weniger so aussieht, wie das was Du Dir hier mühsam zusammen baust.
Für dein Beispiel lässt sich das ganze relativ einfach lösen:
Java:
public String toString() {
String str = "Abteilung " + getName()+":"; //mal das erste \n weglassen
for (Angestellter angestellter : angestellte)
{
str +="\n"; //und pro neuen Angestellten am Anfang in die nächste Zeile
str += "- " + angestellter.getVorname() + " "
+ angestellter.getNachname() + "("
+ angestellter.getAlter() + ")"; //dieses \n brauchen wir auch nicht
}
return str;
ich muss die Klasse durch nen Test jagen und der ist immernoch nicht mit der Ausgabe zufrieden....
Gibt es noch ne andere Möglichkeit beispielsweise mit nem Stringbuilder und dem Befehl delete?
Wenn ja wie müsste das dann aussehen oder kann mir jemand einen Link für ein StringBuilder Beispiel geben?
[Java]
// StringBuilder mit dem ersten String vorbelegt erzeugen
final StringBuilder output = new StringBuilder("Abteilung ");
// Alle weiteren Strings mit "append" hinzufügen (im prinzip wie + bei normalen Strings)
output.append(getName());
output.append(":\n");
.....
// Am Ende die toString-Methode des builders aufrufen, um an das Resultat heranzukommen.
return output.toString();
[/Java]
public String toString() {
final StringBuilder output = new StringBuilder("Abteilung ");
output.append(getName() + ":" + "\n");
for (int i = 0; i < angestellte.size(); i++) {
for (Angestellter angestellter : angestellte) {
output.append("- " + angestellter.getVorname() + " "
+ angestellter.getNachname() + "("
+ angestellter.getAlter() + ")" + "\n");
if (i < angestellte.size() - 1) {
output.append("\n");
}
}
}
return output.toString();
[\JAVA]
und bei der Testausgabe erhalte ich folgenden Fehler:
expected:<... Max Mustermann(31)
[junit] [- Hanne Lore(25)]> but was:<... Max Mustermann(31)
[junit] [
[junit] - Hanne Lore(25)
[junit]
[junit] ]>
viell. seh ich vor lauter bäumen den wald nicht...aber ich kann mir nicht mal den Fehler erklären:-(
Grüße und Danke schonmal im Vorraus
warum 2 for-schleifen? warum überschreibst du nicht einfach in der klasse Angestellter auch die toString? meinst du es ist der sinn von einem StringBuilder, die Strings trotzdem noch mit + zusammenzubasteln ?
mal so in browser getippt (muss nicht sein, dass es kompilier ):
Abteilung:
Java:
@Override
public String toString() {
final StringBuilder output = new StringBuilder("Abteilung ");
output.append(name).append(':');
for (Angestellter angestellter : angestellte) {
output.append('\n').append(angestellter);
}
return output.toString();
}
Angestellter:
Java:
@Override
public String toString() {
final StringBuilder output = new StringBuilder(vorname);
return output.append(' ').append(nachname).append('(').append(alter).append(')').toString();
}
das mit der Schleife hab ich verstanden danke!!!!
Aber ich muss ja dann beide Lösungen für Angestellter und für Abteilung miteinander verknüpfen um die in eine String to String Methode zu kriegen oder nicht? und in deiner angestellten methoder erkennt er die Variablen vorname usw. nicht die adressier ich dann mit
Das ist meistens auch besser, weil einfacher. So hatte javastartup es am Anfang auch. In der Ursprungsfrage war aber das Problem, dass er das letzte Element der Iteration anders behandeln wollte als die anderen (kein \n mehr anfügen). Deswegen hatte ich ihm geraten, die traditionelle Iteration mit index-Variable zu nutzen.
javastartup hat gesagt.:
und wie greife ich dann auf einen explziten angestellten zu wenn ich die 2te for-schleife weglasse?
Aber ich muss ja dann beide Lösungen für Angestellter und für Abteilung miteinander verknüpfen um die in eine String to String Methode zu kriegen oder nicht?
nein, das ist eigentlich alles, was du brauchst. rufst du auf eine instanz von Abteilung die toString auf, wird ja in zeile 6 die toString von dem angestellten (der gerade in der iteration an der reihe ist) aufgerufen.
das mit der Schleife hab ich verstanden danke!!!!
Aber ich muss ja dann beide Lösungen für Angestellter und für Abteilung miteinander verknüpfen um die in eine String to String Methode zu kriegen oder nicht? und in deiner angestellten methoder erkennt er die Variablen vorname usw. nicht die adressier ich dann mit
Das Charmante an nrg's Ansatz ist, dass die Erstellung der String-Repräsentation von Angestellter dort gemacht wird, wo sie hingehört, nämlich in die Klasse Angestellter. Dadurch kannst Du dir in der toString-Methode der Abteilung den Zugriff auf die Felder (name, alter...) der Angestellten komplett sparen. Du musst in der Schleife, in der Du über die Angestellten iterierst dann (wie schon beschrieben) nur noch folgendes machen:
Funktioniert jetzt musste nur nochwas ändern weil bei der Angestelltenklassen-Ausgabe ne andere Darstellung erwartet wurde, als bei der Abteilungdarstellung aber passt alles!
Danke für die ausführliche Erklärung das hilft mir auch für die zukünftigen bearbeitungen weiter...ich finde es jedoch fragwürdig das wort charmant in bezug mit java zu nennen