Java Duplikate aus Hashmap entfernen

Danny787

Ensign
Registriert
Jan. 2007
Beiträge
180
Hallo zusammen

ich habe folgende Frage:

Ich habe eine Hashmap der Form HashMap<Content, Double>.
Das Objekt Content beinhalten ein String Attribut 'Name', welches bei mehreren Content Objekten identisch ist. Diese Entries will ich im ersten Schritt identifizieren.

Im nächsten Schritt sollen von den gefundenen Duplikaten diejenigen aus der Hashmap entfernt werden, bei denen der dazugehörige Double Value am niedrigsten ist. Es soll also von den Duplikaten nur derjenige Eintrag übrig bleiben, der den höchsten Double Value aufweist.

Hat vielleicht Jemand eine Idee, wie ich da am besten vorgehen kann?

Vielen Dank schon mal im Voraus :)

@Dese
Muss am Projekt eines Kollegen weiterentwickeln und da ich keine Lust habe, alles vorhandene komplett zu ändern, muss halt nun dieser Workaround herhalten :-D

Viele Dank an Alle für eure Hilfe!
 
Zuletzt bearbeitet:
Hilfs-HashMap definieren
HashMap<String, Entry<Content, Double>> helper

über das keySet deiner Map iterieren
for (Entry<Content, Double> entry : hashMap.keySet()) {

und dann schauen, ob in helper ein Eintrag zu entry.getKey().getName() ist... wenn ja, das Double vergleichen, ist der kleiner den Eintrag ersetzen, ansonsten weiter mit dem nächsten. Wenn es zu den Name keinen Eintrag gab, den entry in die helper-Map hinzufügen.

Den Double-Wert eines Entries bekommst du über getValue() dann... ob die Methode getName() heißt hab ich nur mal angenommen... ist ja auch nur die Idee dahinter...

in der Helper-HashMap sind am Ende alle Content-Double-Paare... die einfach in die alte HashMap bringen (diese halt vorher löschen)

@Yuuri: Klasse Lösung! Ich weiß zwar nicht für welches Problem aber sieht smart aus ...
 
Zuletzt bearbeitet:
ich geb dir erstmal eine lösung für genau das, wo nach du gefragt hast. danach frag ich dich aber warum das überhaupt eine so scheinbar unsinning situation vorliegt.

also....
bau dir ne neue hasmap:
HashMap<String, HashMap.Entry<Content, Double>> helpMap = new ....

geh einmal die liste aller entries der hashmap durch

Code:
for( Entry<Content, Double> entry : map.entrySet() ) {
     if( helpMap.containsKey(entry.getKey().name) ) {
           Content     cnt = helpMap.get( entry.getKey().name );
           if( entry.getValue > map.get( cnt ) ) {
                  helpMap.put( entry );
           }
     }else{
           helpMap.put( entry.key.name, entry );
     }
}

danach hast du in der helpMap ansich alles was du wissen musst. bau dir deine hasmap neu auf, nur mit den objekten aus deiner helpmap und den dazugehörigen double values die du in der orignalen map findest.


aber warum hast du so nen kram SO überhaupt in einer hashmap liegen, bzw. nur da drinn?

edit: mist.. wie formatiert man code heir im forum? :D

edit2: was 1668mib geschireben hat ist im grunde die gleiche lösung.
 
Zuletzt bearbeitet:
@Dese: Unsere Ansätze sind ähnlich, würde aber direkt den Entry in der Hilfs-HashMap merken ;-)

Edit: Ach mensch, wollt grad noch " bis gleich" einfügen, aber da hast ja schon zitiert, dann wär's unhöflich :P
 
Zuletzt bearbeitet:
1668mib schrieb:
@Dese: Unsere Ansätze sind ähnlich, würde aber direkt den Entry in der Hilfs-HashMap merken ;-)

nicht nur ähnlich. ja dachte auch daran, aber da hat ich's schon abgeschickt ;)
 
ah, danke!

edit: habs mal auf deine variante abgeänedrt. gleich das ganze entry speichern ist hilfreicher.
 
1668mib schrieb:
Klasse Lösung! Ich weiß zwar nicht für welches Problem aber sieht smart aus
:P Hab wohl das Problem nicht ganz verstanden.

Warum denn keine HashMap im Stil von Hashmap<String, ContentValue>, wobei ContentValue = T<Content, Double> ist? So kann man problemlos auf Hashmap[Key].getKey() oder .getValue() zugreifen und brauch keinerlei Hilfe von anderen Objekten o.ä. Müsste natürlich nur der String vom Content unique sein.

So ließe sich ganz einfach über
Code:
if( DoubleVal > Hashmap[ContentValue.getUniqueString()].getValue() )
  Hashmap[ContentValue.getUniqueString()].setValue( DoubleVal );
immer nur der höchste Wert sammeln.

PS: Hab allerdings kaum Ahnung von Java, also nich meckern, wenn Klassen o.ä. falsch oder anders vorhanden sind. ;)
 
Dein ContentValue ist nichts anderes als das Entry<Content, Double> ;-)

Und bei dir fehlt halt noch die Abfrage, ob überhaupt ein Wert mit dem UniqueString in der HashMap ist dann...
die "falschen" HashMap-Zugriffe via Eckiger-Klammer-Ausdrücke mal außen vor... wenn man alles anpasst, bist du vermutlich am Ende genau dort, wo Dese und ich auch sind...

wobei die Zeile hier noch nicht ganz optimal ist: "Hashmap[ContentValue.getUniqueString()].setValue( DoubleVal );"
Es soll ja der Content genommen werden, bei dem der Wert am höchsten nicht.. es soll nicht irgendeine Content-Instanz genommen werden und dar maximale Wert mit ihr verknüpft werden...

Beispiel:
Content hat ne ID und nen Int-Wert
1. Content: ID:X, Int:10
2. Content: ID:X, Int :20

Mit dem 1. Content ist der Double-Wert 10 und mit dem 2. Content der Wert 20 verknüpft...
Bei deiner Variante käme als Ergebnis raus
1. Content mit ID:X, Int:10 und verknüpftem Double 20
gewünscht wäre aber wohl eher
2. Content mit ID:X, Int:20 und verknüpftem Double 20

ka ob das verständlich war...
 
Zurück
Oben