Guava Multimap che unisce elementi consecutivi con la stessa chiave

0

Ho giocato con Guava Multimaps e mi sono imbattuto in un problema con il monitoraggio quando un utente è danneggiato (più il modo in cui viene visualizzato, in realtà)

Diciamo che ho un Multimap<User, Hit> e Hit composto da 2 campi: damager (stringa) e danno (doppio).

Ecco un esempio di come potrebbe essere la mia collezione:

  1. dangerous01, 6
  2. dangerous01, 4
  3. dangerous01, 1
  4. dangerous03, 9
  5. dangerous01, 3

Il modo in cui l'ho visualizzato comporterebbe qualcosa di simile a questo:

dangerous01 dealt 6 damage
dangerous01 dealt 4 damage
dangerous01 dealt 1 damage
dangerous03 dealt 9 damage
dangerous01 dealt 3 damage

Ma vorrei che assomigliasse a questo:

dangerous01 dealt 11 damage
dangerous03 dealt 9 damage
dangerous01 dealt 3 damage

L'ordine nella raccolta si basa sull'inserto in modo che possano essere informazioni utili. Al momento sto anche utilizzando gli stream per scorrere il Hit s.

    
posta Teti 31.05.2016 - 22:05
fonte

2 risposte

0

Quello che potresti desiderare è Multiset, un'altra raccolta Guava. Da un punto di vista, un multiset è solo una raccolta che condensa i duplicati per risparmiare memoria. Ma può anche essere visto come una mappa di oggetti da contare. Ogni utente potrebbe quindi avere un campo Multiset<String> . Per registrare il danno, devi semplicemente fare user.damagers.add(damager, count); Aggiorna la quantità di danni inflitti da damager dal valore specificato.

Sfortunatamente, ciò richiederebbe l'uso di valori di danno intero. Se non puoi farlo, dovresti usare una mappa di base e controllare se il valore è nullo prima di aggiornarlo, come suggerito da GlenPeterson.

    
risposta data 31.05.2016 - 22:44
fonte
0

Perché stai usando un multimap invece di una mappa? Invece di (Pseudocodice):

Multimap.put(someUser, newDamage)

Utilizza una mappa normale:

Damage currentDam = map.get(someUser)
if (currentDam == null) {
    currentDam = 0;
}
map.put(someUser, currentDam + newDamage)

Se hai bisogno della multimap per qualche altro motivo, puoi utilizzare la stessa tecnica per riassumere i risultati già presenti nella tua multimap.

    
risposta data 31.05.2016 - 22:23
fonte

Leggi altre domande sui tag