2014-11-15 24 views
9

In C++, wenn ich eine Karte wie std :: map mWie wird der Wert für einen bestimmten Schlüssel in einer Map in Java erhöht?

dann erkläre ich den Wert für einen bestimmten Schlüssel in der Karte

auf diese Weise erhöhen kann
m[key]++ 

In Java deklarieren wir eine Karte

Map<Integer, Integer> m = new HashMap<>(); 

und ich erhöhe den Wert für einen bestimmten Schlüssel auf diese Weise:

m.put(key, m.get(key).intValue() + 1) 

Meine Frage: Gibt es eine Abkürzung oder einen besseren Weg, dies zu tun?

+0

Sie brauchen nicht intValue Methode aufzurufen. Sie könnten eine Methode für Ihren angepassten Wert definieren (Alle Integer/Double usw. des Wrappers sind in Java unveränderlich) und können sagen m.get (key) .increment(); – SMA

Antwort

13

Sie könnten compute (Java 8+) verwenden:

m.compute(key, (k, v) -> v + 1); 
+1

danke. Ich habe etwas studiert, was du hier getan hast. diese Art von Ausdruck ist für mich sehr neu. Von meinem Studium habe ich nicht viel verstanden. es wäre sehr hilfreich, wenn Sie mit Ihrem gegebenen Ausdruck ein einfaches Beispiel geben würden. Ich schaute diese [site_1] (http: // http: //radar.oreilly.com/2014/04/whats-new-in-java-8-lambdas.html) und [site_2] (http: // radar .oreilly.com/2014/08/java-8-functional-interfaces.html). – seal

6

Sie brauchen die .intValue() nicht wegen Autoboxing, aber ansonsten gibt es keinen besseren Weg, dies zu tun.

m.put(key, m.get(key) + 1) 

Der Grund (oder das Problem) ist, dass Java entschieden, ihre eigenen Betreiber nicht zu lassen, Klassen implementieren (wie es in C++ möglich ist).

+0

Ich denke, dass "kein besserer Weg" relativ ist. Leistung und GC weise würde ich für meine Antwort argumentieren. Minimale Abhängigkeiten und einfache Implementierung gewinnt. –

+0

Ja, Sie haben Recht. Mit "kein besserer Weg" meinte ich bei der Verwendung einer einfachen "Map ". Ihre Lösung ist besser, wenn Sie eine 1: 1 Karte nicht verwenden. – Misch

2

Sie können den Anruf intValue fallen lassen und sich auf automatisches Unboxing verlassen.

6

Ich habe immer eine mutable int für diese Probleme verwendet. So sieht der Code am Ende aus wie ...

Dies vermeidet den unnötigen Put-Overhead (der klein ist).