2016-07-20 9 views
-1

Ich möchte:ConcurrentHashMap: wie Sie den Wert eines Eintrags nur ersetzen, wenn der aktuelle Wert smalle ist

  1. einen Eintrag zu einem ConcurrentHashMap hinzufügen, wenn es keinen Eintrag für den Schlüssel ist, oder
  2. Ersetzen Sie den Wert für den Schlüssel nur, wenn der aktuelle Wert kleiner ist.

kam ich mit dem folgenden Code, aber Sinus hat while (true), es mir unheimlich aussieht :)

Ich wollte es mit euch überprüfen. Denkst du, es funktioniert?

// Input: map, k, t 
while (true) { 
    if (map.containsKey(k)) { 
     current = map.get(k); 
     if (current != null && current < t) { 
      if (map.replace(k, current, t)) 
       break; 
     } else if (current != null && current >= t) { 
      break; 
     } 
    } else { 
     pre = map.putIfAbsent(k, t); 
     if (pre == null) 
      break; 
    } 
} 
+0

Haben Sie es versucht? Haben Sie es in Ihrem IDE-Debugger ausgeführt und durchlaufen Sie jeweils Zeile für Zeile? Bitte tun Sie das, es wird viel lehrreicher sein, als wenn Ihnen jemand davon erzählt. Und übrigens, es gibt keine Notwendigkeit für die "while (true)" (oder eine Schleife irgendeiner Art) überhaupt. –

+0

Verwenden Sie 'Map.entrySet()' zum Iterieren –

+0

@JimGarrison warum brauche ich nicht (wahr)? Angenommen ein Thread möchte t schreiben, aber die Map hat bereits den Schlüssel, also geht es zum ersten If. Wenn er ersetzt wird, gibt die Ersetzung den Wert false zurück, da der Wert sich in der Zwischenzeit durch einen anderen Thread auf einen Wert geändert hat, der höher als der aktuelle, aber kleiner als t ist. Da der Thread "t" schreiben möchte (da t höher ist), muss er von vorne beginnen. –

Antwort

5

Wenn Sie Java 8 verwenden, können Sie die Methode merge verwenden. Es dauert:

  • den Schlüssel K zu
  • ein Wert V zu verwenden, um Karte, wenn nicht bereits ein Wert bei K
  • ein BiFunction<K,K,V> F, die alle bereits vorhandenen Wert mit V kombiniert ist, und speichert es auf der K

Für Ihren Anwendungsfall müssten Sie:

  • K: Ihr Schlüssel
  • V: der neue Wert
  • F: eine Funktion, die seinen beiden Eingängen vergleicht, und liefert die höhere der beiden

Wenn es auf der K nicht bereits ein Wert ist, wird es nur V. speichern Andernfalls Sie übergibt das neue V und das alte V an Ihre Funktion und speichert das Ergebnis in K. Da Ihre Funktion den höheren der beiden Werte zurückgibt, wird der Wert ersetzt, wenn er höher als der vorherige Wert ist.

+1

OP verwendet 'replace()', das in Java 8 hinzugefügt wurde, also OP * ist * mit Java 8. – Andreas

+0

Vielen Dank, ich werde versuchen, diese Methode zu verwenden. Übrigens weise ich den höheren Wert nicht kleiner zu. –

+0

@MohammadRoohitavaf Es sollte eines der Argumente sein, die an diese BiFunction übergeben werden. Funktioniert das nicht? – yshavit