2014-11-15 12 views
9

In C++, se dichiaro una mappa come std :: map mCome incrementare il valore per una chiave specifica in una mappa in java?

allora posso incrementare il valore per una chiave specifica nella mappa in questo modo

m[key]++ 

In Java dichiaro una mappa

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

e incrementare il valore per una chiave specifica in questo modo:

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

La mia domanda: c'è qualche scorciatoia o un modo migliore per farlo?

+0

Non avete bisogno di chiamare il metodo intValue. È possibile definire un metodo sul valore personalizzato (Tutti i wrapper Integer/Double etc sono immutabili in java) e può dire m.get (chiave) .increment(); – SMA

risposta

13

Si potrebbe utilizzare compute (Java 8+):

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

grazie. ho fatto qualche studio su cosa hai fatto qui. questo tipo di espressione è molto nuovo per me. dal mio studio non ho capito troppo. sarebbe molto utile se tu dessi un semplice esempio con la tua espressione data. ho guardato questi [site_1] (http: // http: //radar.oreilly.com/2014/04/whats-new-in-java-8-lambdas.html) e [site_2] (http: // radar .oreilly.com/2014/08/java-8-functional-interfaces.html). – seal

6

Non è necessario il .intValue() a causa di autoboxing, ma a parte questo, non esiste un modo migliore per farlo.

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

La ragione (o il problema) è che Java ha deciso di non lasciare che le classi implementare i propri operatori (come è possibile in C++).

+0

Penso che il "modo migliore" sia relativo. Le prestazioni e il saggio del GC direi la mia risposta. Dipendenze minime e facilità di implementazione vince. –

+0

Sì, hai ragione. Con "no better way" intendevo mentre usavo un semplice 'Map '. La tua soluzione è migliore se l'uso di una mappa 1: 1 non è un requisito. – Misch

2

È possibile interrompere la chiamata intValue e fare affidamento sull'auto-unboxing.

6

Ho sempre preferito utilizzare uno mutable int per questi problemi. Quindi il codice finisce per sembrare ...

m.get(key).increment() 

Ciò evita l'overhead put non necessario (che è piccolo).

Problemi correlati