# In einer HashMap einen String löschen



## thetilleulenspiegel (2. Nov 2005)

Hallo Liebe Forummitglieder ich ein Java Neuling habe ein spezifische Frage zu einer HashMap.

In einem Programm welches ich gerade schreibe möchte ich in einer HashMap (ist mit mehreren Werten wie: Namen Alter Geb Dat usw. befüllt) über remove einen von mir bestimmten Namen (nicht der Key) löschen. 
In der API finde ich nur remove(Objekt key) aber keinen hinweis darauf wie ich aus den Wert Daten bekomme woraus das Prog. schliesen könnte was gelöscht werden soll. Mit Aufruf von values bekomme ich nur eine allgemeine übersicht.
Mit Aufruf von get nur den Wert des Key´s  den ich angebe. Gibt es eine Möglichkeit den Wert nach einen bestimmten String zB. Namen zu durchsuchen und dann den Key zurückzubekommen?

Vielen Dank im voraus


----------



## Guest (2. Nov 2005)

Sprichst du so, wie du schreibst? Deine Frage ist verdammt schwierig zu verstehen. 
(Falls Deutch Fremdsprache für dich ist, dann sorry.  )

Um einen bestimmten Wert (Value) in HashMap zu löschen, ohne den Schlüssel (Key) 
zu entfernen, setzt du einfach diesen Wert auf null.
z.B.
	
	
	
	





```
map.put("Vorname", null);
map.put("Alter", null);
```


----------



## bygones (2. Nov 2005)

ich versteh auch nicht so recht was eigentlich wie in der Map drin ist.

du kannst aber z.b. durch die Map per Map.Entry iterieren. Jeder Map.Entry hat eine key und einen value Variable. Vergleich der value Variable und dann entsprechenden Eintrag löschen. Das führt aber eigentlich die HashMap ad absurdum, da du somit den Hashalgorithmus, der eben zum u.a. schnellen auffinden von Einträgen existiert, umgehst.

wenn du wirklich eine struktur wie mein Vorposter meint hast, also 

```
map.put("Vorname", null);
map.put("Alter", null);
```
dann würde ich mir vll eher eine sinnvollere OOP Lösung überlegen. D.h. in dem Fall ein eigenes Objekt und einen passenden Schlüssel für die Objekte, so dass du über diesen dann z.b. direkt löschen kannst !!


----------



## Guest (2. Nov 2005)

:shock: Übrigens, ich meinte "Deutsch" nicht "Deutch" :autsch::wink:

Edit Illuvatar: Ich liebe diese Posts mit so unendlich viel Inhalt :autsch:


----------



## Sky (2. Nov 2005)

1.) Gehören all deine Werte (Namen Alter Geb Dat) zu einer Person oder zu mehreren? 

2.) Was hast Du, und was willst Du ?
Ich verstehe das so:
	
	
	
	





```
map.put("name", "Fritz");
```
Und in dem Beispiel soll Fritz gelöscht werden ? Falls dem so ist, erstelle eine Klasse Person, welche die gewünschten Attribute enthält und speichere dann in der Map ("Fritz", meinPersonenObject).


----------



## Bleiglanz (2. Nov 2005)

1) du kannst NUR per Key löschen

2) es gibt keine Möglichkeit, sich für ein Value den Key geben zu lassen

also: iteriere über das EntrySet, wenn der Value der gewünschte ist, dann machst du remove(entry.getKey())


----------



## Guest (2. Nov 2005)

Anonymous hat gesagt.:
			
		

> Edit Illuvatar: Ich liebe diese Posts mit so unendlich viel Inhalt :autsch:


Werde ja nicht zu sentimental. :wink:


----------



## Guest (2. Nov 2005)

Vielen Dank für die vielen Anregungen konnte das Problem leider noch nicht lösen.

Zum besseren Verständnis: Student erbt von Person; es werden folgende Parameter mitgegeben: String Name, int Alter, String Adresse, char geschlecht, und String matrikel Nr:. Die Matrikelnummer wird zum Key. Der Student wird in der Klasse Schule einer HashMap übergeben. Nun möchte ich den Student XY aus der HashMap entfernen. Mit den Vorschlägen map.put(name, null) hat es nicht funktioniert (keine Reaktion der Hashmap) Vermutlich weil die Parameter nun mehr ein Wert sind.

Und Ja ich rede auch so wie ich schreibe Muttersprache Deutsch Österr.
auch meine Frau meint dass sie mich oft nicht versteht. Also Sorry für Unannehmlichkeiten.


----------



## thetilleulenspiegel (2. Nov 2005)

oben angeführter text stammt von mir, sorry anfängerfehler.

mfg.


----------



## Bleiglanz (2. Nov 2005)

dann probiers halt mit 

remove(matrikelnummer)?


----------



## thetilleulenspiegel (2. Nov 2005)

Habe ich schon, möchte mir aber keine 8 Stellige Ziffer merken oder eine Liste führen müssen.
Ich möchte mittels des Namens die Matrikelnumer erhalten und dann löschen. Nur bekomme ich nie Einzelwerte sondern immer den gesamten Wert geliefert. Vielleicht gibt es eine Möglichkeit Werte wie XY aus der HashMap herauszubekommen, die Frage ist nur wie?

lg


----------



## Bleiglanz (2. Nov 2005)

was passiert wenn es zwei Hubers gibt?

also nochmal: iteriere über das EntrySet, wenn der entry.getValue().getName().equals("Huber"), dann machst du remove(entry.getKey())


----------



## Guest (2. Nov 2005)

OK ich habe es versucht habe in API und Javabuch nachgelesen was ein Iterator ist und wie er funktioniert,
habe aber keine Hinweise gefunden bezüglich HashMap und Iterator und EntrySet.

Ich kann ein EntrySet aufrufen mit studenten.entrySet().iterator(). usw.  bekomme aber keine getValue oder ähnliches zur auswahl. Ausserdem verstehe ich manche Erklärungen der API doc nicht.

zB: public static interface Map.Entry<K,V> ???
hier verstehe nicht wie ich daraus schlau werden soll wie ich nun eine Map.EntrySet anwende. 

denn jedesmal wenn ich versuche aufzurufen oder zu instanzieren bekomme ich Fehlermeldungen wie
"Cannot instatiate the Type Map.Entry" 
dürfte mir noch zu hoch sein.

@Bleiglanz

iteriere über das EntrySet ist nett gemeint kann ich aber nicht auflösen.
Mein Versuch:  studenten.entrySet().iterator().hasNext(); da ist es aber dann aus.

Liegt sicher an meiner Unkenntnis der richtigen Ausdrucksweise.

Bitte nochmals um Hilfe!

Danke im Voraus.

the Till


----------



## Guest (2. Nov 2005)

Hier ein Beispiel
	
	
	
	





```
// Alte Syntax
HashMap m1 = new HashMap();
m1.put("vorname", "Bart");
m1.put("nachname", "Simpson");
m1.put("alter", Integer.valueOf(8));

for(Iterator i = m1.entrySet().iterator(); i.hasNext();) {
  Map.Entry entry = (Map.Entry)i.next();
  System.out.println(entry.getKey() + " = " + entry.getValue());
}

// Neue Syntax
HashMap<String, Object> m2 = new HashMap<String, Object>();
m2.put("vorname", "Bart");
m2.put("nachname", "Simpson");
m2.put("alter", 8);

for(Iterator<Map.Entry<String, Object>> i = m2.entrySet().iterator(); i.hasNext();) {
  Map.Entry entry = i.next();
  System.out.println(entry.getKey() + " = " + entry.getValue());
}

for(Map.Entry<String, Object> entry : m2.entrySet()) {
  System.out.println(entry.getKey() + " = " + entry.getValue());
}
```


----------



## Guest (3. Nov 2005)

Hallo Java Helferleins, ich möchte mich bedanken für die tollen Anregungen und Tips die ihr mir mitgeteilt habt.
Habe nun die Lösung parat und möchte sie euch zeigen um eventuell andere Anfänger eine Hilfestellung zu geben.
Freue mich wieder einen Schritt zu mehr Wissen in Java Programmiertechniken gemacht zu haben.

Danke!


```
public void removeName(String name){
    
    for(Iterator i = studenten.entrySet().iterator(); i.hasNext();) {//Arbeitet die HashMap durch mit einem Iterator
      Map.Entry entry = (Map.Entry)i.next();
      
      //Überprüft ob der Übergebene String im Value vorhanden ist und weist dass Objekt Key einem String zu.
      if (entry.getValue().toString().substring(8).startsWith(name)== true){
          String löschNamen = entry.getKey().toString().intern(); 
          this.löschVariable = löschNamen;
      }      
    }       
    }
    
    public void removeMitNamen(String namen){//Löscht den Key mit den angegebenen Namen.
        
        removeName(namen);
        studenten.remove(löschVariable);
    }
```


----------



## thetilleulenspiegel (3. Nov 2005)

eh klar wieder nicht eingeloggt ???:L 

Post oberhalb ist von mir.

mfg.

the Till


----------



## Guest (3. Nov 2005)

Wenn, dann doch lieber wie folgt:
	
	
	
	





```
public void removeName(String name)
{
  for(Iterator i = studenten.entrySet().iterator(); i.hasNext();)
  {
    Map.Entry entry = (Map.Entry)i.next();
    if(entry.getValue() != null && entry.getValue().toString().startsWith(name))
    {
      i.remove(); // Aktuellen Eintrag löschen
      break; // und raus
    }      
  }       
}
```


----------



## Bleiglanz (3. Nov 2005)

Anonymous hat gesagt.:
			
		

> Hallo Java Helferleins, ich möchte mich bedanken für die tollen Anregungen und Tips die ihr mir mitgeteilt habt.
> Habe nun die Lösung parat und möchte sie euch zeigen um eventuell andere Anfänger eine Hilfestellung zu geben.
> Freue mich wieder einen Schritt zu mehr Wissen in Java Programmiertechniken gemacht zu haben.
> 
> ...




noch ein paar Anregungen für einen Anfänger:

this.löschvariable ist Käse: erstens ist da ein ö drin, dafür musst du 5 € in die UmlautVerwenderKasse zahlen; und warum machst du dafür eine Membervariable??

am besten alles in einer Methode!!


```
if (entry.getValue().toString().substring(8).startsWith(name)== true){
          String löschNamen = entry.getKey().toString().intern(); 
          this.löschVariable = löschNamen;

     // bitte lass das == true weg

     // und lass das intern() auch gleich weg

     // und bedenke, dass das substring(8).startsWith möglicherweise zuviel löscht

     // ich dachte mehr an
     if( ((Person) entry.getValue()).getName().equals(name) ){
         studenten.remove(entry.getKey());
     }
```


----------



## Guest (3. Nov 2005)

Bleiglanz hat gesagt.:
			
		

> ```
> ...
> if( ((Person) entry.getValue()).getName().equals(name) ){
> studenten.remove(entry.getKey());
> ...


Das ergibt sicherlich eine hübsche RuntimeException beim nächsten
Schleifendurchgang. (Iterator und Remove)  :bae:


----------



## thetilleulenspiegel (7. Nov 2005)

Bin wieder im Lande möchte mich mich nocheinmal Bedanken für die Hilfreichen Tips und Lösungsvorschläge.
Ihr seid Großartig

PS: Problem gelöst! :wink:


----------



## Bleiglanz (7. Nov 2005)

Anonymous hat gesagt.:
			
		

> Bleiglanz hat gesagt.:
> 
> 
> 
> ...


jo, das war übel :noe:


----------

