toString-Methode für Map

Sinista

Mitglied
moin

ich hab mir paar schöne Klassen geschrieben

Ich hab ne Map in der ich Personen habe die wiederum aus Usern bestehen und alles was dazugehört haben wie password, username usw.
Dann habe ich auch eine Main TestFrame die vorgegeben ist und die ich nicht verändern darf.

Deswegen habe ich meine Klasse ZMS in der einige Methoden und die Map erstellt wird und Personen, User (und noch einige andere Klassen die aber wohl für die frage ,hoffe ich net wichtig sind).

Nun möchte ich zur ausgabe der Map eine toString-Methode schreiben.

Bisher habe ich nur folgendes gemacht (mal nen Beispiel aus meiner Klasse Person wobei mir klar ist das das irgendwie anders muss 🙂)
Java:
package klausuren;

public class Person {

	String sname;
	String fname;
	String dep;
	int id;

	public Person(String sname, String fname, String dep) {
		setSname(sname);
		setFname(fname);
		setDep(dep);
	}

	public String getSname() {
		return sname;
	}

	public void setSname(String sname) {
		this.sname = sname;
	}

	public String getFname() {
		return fname;
	}

	public void setFname(String fname) {
		this.fname = fname;
	}

	public String getDep() {
		return dep;
	}

	public void setDep(String dep) {
		this.dep = dep;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}

	public String toString() {
        return "Name: " + sname + "\nVorname: "
        + fname + "\ndep: " + dep + "\nAktion: " + id;
    } 
	
	
}


Was ich jetzt gerne wissen würde wie bekomme ich ne toString methode hin die mir die ganze map ausgibt.
- Reicht das wenn ich eine Methode in der Klasse schreibe in der ich meine Map habe oder muss ich für jede klasse so eine methode schreiben und wie rufe ich diese Methode auf wenn ich sie nicht in der main aufrufen darf?
 
Meinst du sowas:
Java:
        Map<String,String> map = new HashMap<String, String>();
        StringBuilder builder = new StringBuilder();
        for(Map.Entry<String, String> entry : map.entrySet()) {
            builder.append(entry.getValue().toString());
        }
        String bla = builder.toString();
 
Meinst du sowas:
Java:
        Map<String,String> map = new HashMap<String, String>();
        StringBuilder builder = new StringBuilder();
        for(Map.Entry<String, String> entry : map.entrySet()) {
            builder.append(entry.getValue().toString());
        }
        String bla = builder.toString();

danke das sieht doch schon interessant aus🙂
werds mal ausprobieren und mich mal wieder melden
 
Zuletzt bearbeitet:
wollte mal fragen ob ich das auch richtig verstehe

StringBuilder builder = new StringBuilder();
damit wird der StrinBuilder erzeugt


for(Map.Entry<String, String> entry : map.entrySet()) {
builder.append(entry.getValue().toString());
}

for schleife in der an den builder immerwieder die methode getValue drangehängt wird
String bla = builder.toString();

wenn ich diese methode jetzt habe kann ich die auch aufrufen ohne das in die main zu schreiben sprich einfach system.out... dahintersetzten?
 
wollte mal fragen ob ich das auch richtig verstehe
StringBuilder builder = new StringBuilder();
damit wird der StrinBuilder erzeugt
genau
for(Map.Entry<String, String> entry : map.entrySet()) {
builder.append(entry.getValue().toString());
}

for schleife in der an den builder immerwieder die methode getValue drangehängt wird
jedes Element der Map wird durchlaufen und temporär in eine Map namens entry geschrieben (wird im Schleifenkopf deklariert) und von dieser der Wert an den StringBuilder drangehängt.
String bla = builder.toString();

wenn ich diese methode jetzt habe kann ich die auch aufrufen ohne das in die main zu schreiben sprich einfach system.out... dahintersetzten?

wenn du einen String return hast schon.

Java:
return builder.toString();


grüße
 
> in der methode von oben

welche? wo geht es überhaupt um Maps, im Code vom ersten Posting jedenfalls nicht,
poste doch mal etwas mehr zur Umgebung,

builder.toString() liefert einen String, was du damit machen willst ist eine zweite Frage,
kann man direkt ausgeben oder zurückgeben, wenn es eine Methode ist,
natürlich nicht gerade die main-Methode, aber andere wie

public String toString() {
..
}

oder


public String gibStringFuerIrgendwas() {
..
}
 
>jedes Element der Map wird durchlaufen und temporär in eine Map namens entry geschrieben

hum? Man Iteriert über das entrySet() der Map. Die Methode liefert ein Set von Entry<K,V>.
Da Entry eine innere Klasse ist: Map.Entry<K,V> (aber nur zur veranschaulichung, würd ich sonst
nicht machen und nur Entry schreiben)

EDIT:
Ein Entry ist nix anderes als ein Key-Value Paar der Map. getValue() gibt dass logischerweise
den Value des Eintrags zurück. getKey() den key der benutzt wurde um den Value in die Map zu kriegen.
 
Zuletzt bearbeitet:
sorry die frage war unnötig habs jetzt hinbekommen mit return


würde jetzt nur noch gerne wissen an welcher stelle ich das formatieren kann weil ich so ne ausgabe bekomme

Account: chok_c
Password: klausuren.Password@a3901c6Account: allma_ag
Password: klausuren.Password@24a37368Account: hase_h
Password: klausuren.Password@66edc3a2Account: marx_m
Password: klausuren.Password@3c6f579Account: feuers_f
Password: klausuren.Password@7b1ddcdeAccount: kluge_k
Password: klausuren.Password@658fb1f7Account: duck_d
Password: klausuren.Password@3ced0338Account: torfs_t
Password: klausuren.Password@6c6e70c7Account: wolf_w
Password: klausuren.Password@46ae506eAccount: xanadu_x
Password: klausuren.Password@5e228a02Account: defoy_d
Password: klausuren.Password@2d92b996Account: eilig_e
Password: klausuren.Password@7bd63e39Account: flof_f
Password: klausuren.Password@2e8f4fb3Account: allma_aa
Password: klausuren.Password@42b988a6Account: gjoen_g
Password: klausuren.Password@22ba6c83Account: allma_ac
Password: klausuren.Password@7d2a1e44

Ich würde da ja gerne nur name, password ... stehen haben.
kann ich das so in der schleife deklarieren

"Account: " + account + "\nPassword: "
+ pw + "\nPerson: " + person ;
 
pw ist vom unbekannten Typ Password, du musst dessen toString()-Methode überschreiben oder
pw.getEinenString() aufrufen, wenn es z.B. irgendeine Methode gibt, die das Passwort als String zurückgibt

der Zeilenumbruch \n zwischen Account und Passwort ist ja merkwürdig..
 
pw ist vom unbekannten Typ Password, du musst dessen toString()-Methode überschreiben oder
pw.getEinenString() aufrufen, wenn es z.B. irgendeine Methode gibt, die das Passwort als String zurückgibt

hast recht 🙂

Ich habe auch eine klasse Password die von der aufgabe verlangt wird aber ich momentan noch net soweit bin das sie verwendet wird

Java:
package klausuren;

public class Password {
	
	String secret_pw;

	public String getSecret_pw() {
		return secret_pw;
	}

	public void setSecret_pw(String secretPw) {
		secret_pw = secretPw;
	}

}

Jetzt frage ich mich nur grade ob ich das Password was ich mir in User erstelle in irgendeiner weise damit zu tun hat

Java:
package klausuren;

public class User {

	String account;
	Password pw;
	Person person;
	int id;

	public User(String account, Password password, Person person) {
		setAccount(account);
		setPw(password);
		setPerson(person);
	}


	public String getAccount() {
		return account;
	}

	public void setAccount(String account) {
		this.account = account;
	}

	public Password getPw() {
		return pw;
	}

	public void setPw(Password pw) {
		this.pw = pw;
	}

	public Person getPerson() {
		return person;
	}

	public void setPerson(Person person) {
		this.person = person;
	}

	public int getId() {
		return id;
	}

	public void setId(int id) {
		this.id = id;
	}
	public String toString() {
        return "Account: " + account + "\nPassword: "
        + pw + "\nPerson: " + person + "\nID:" + id +"\n";
    } 
	
}

Da ich ja Password pw verwende aber auch schon eine getter methode habe und die ausgabe klappt jetzt bis auf das PW ganz gut

Account: chok_c
Password: klausuren.Password@a3901c6
Person: Name: Chok
Vorname: Charlie
dep: Marketing
ID: 0
ID:0

Wird mein password dan in der klasse Password gespeichert oder bleibt das in der Klasse User, weil ich sonst die methode getSecret_pw() verwenden würde.
glaube aber net das das richtig ist weil secret_pw was anderes ist wie pw
 
Ich weiss jetzt nicht genau was du willst, aber mal allgemein:

Wenn du eine String-Operation auf ein Objekt aufrufst, wird automatisch die toString() Methode des Objektes benutzt. Wenn du keine toString() definiert hast, diejenige der Oberklasse, bis zu Object. Die von Object macht:
getClass().getName() + '@' + Integer.toHexString(hashCode())

wenn du also auf ein Password-Objekt eine String-Operations aufrufst, wird das durch das da oben ersetzt
zB
Java:
Password p = new ...
System.out.println(p); // --> toString von Object: klausuren.Password@a3901c6
//das gleiche bei + etc:
String s = "test:::" + p; // --> test:::klausuren.Password@a3901c6

wenn du was anderes willst, musst du eben toString überschreiben.
 
also das bedeutet das ich keine vernünftige toString ausgabe für pw habe?
wenn ich jetzt zum beispiel diese variablen nehme die ich ausgebe


String account;
Password pw;
Person person;
int id;

dan bekomme ich ja für alles bis auf pw meine passende ausgabe.
und bei den anderen sachen habe ich ja auch nix besonderes gemacht, der einzige unterschied zu der klasse Person ist nur das es dort nen Konstruktor gibt

Ich hab in meiner klasse Password auch ne toString methode eingefügt die secret_pw ausgibt aber da bekomme ich dan nur null zurück

ich glaube ich habe auch noch net ganz kapiert an welcher stelle ich bei dem Password ansetzten muss. Bei Password pw oder String secret_pw wobei ich glaube das es das erste ist.
 
so ca. wäre optimal:
Java:
public class Password {

private String password;

public Password(String password) {
 if(password == null) {
  throw new IllegalArgumentException("password is null");
 }
this.password = password;
}

@Override
public String toString() {
 return this.password;
}
}

Das Problem bei deiner Variante:
Du erstellst evtl ein Password-Objekt. alles wird mit null initialisiert (alle Objekte, dazu gehört auch String).
Nun gibts du das Objekt (String) [edit2] in der toString-Methode[/edit2] zurück. Naja...ist null. Also "null".
Bei Person hast du sicher toString mit "Name" + name; überschrieben.

EDIT:
Wenn du bei deiner Version das Passwort nicht mit der set-Methode setzt, ist es eben null.
 
Zuletzt bearbeitet:
so ca. wäre optimal:
Java:
public class Password {

private String password;

public Password(String password) {
 if(password == null) {
  throw new IllegalArgumentException("password is null");
 }
this.password = password;
}

@Override
public String toString() {
 return this.password;
}
}

Das Problem bei deiner Variante:
Du erstellst evtl ein Password-Objekt. alles wird mit null initialisiert (alle Objekte, dazu gehört auch String).
Nun gibts du das Objekt (String) [edit2] in der toString-Methode[/edit2] zurück. Naja...ist null. Also "null".
Bei Person hast du sicher toString mit "Name" + name; überschrieben.

EDIT:
Wenn du bei deiner Version das Passwort nicht mit der set-Methode setzt, ist es eben null.


vielen dank für deine hilfe jetzt wird mir einiges klarer
 

Zurück
Oben