Domanda

I desidera memorizzare una collezione di oggetti che sono calettati sulla base di un valore che essi rappresentano. Questi tasti possono essere ripetuta. per esempio:.

 [4] => Bob
 [5] => Mary
 [5] => Sue
 [9] => Steve
[10] => Jason
[10] => Michelle

In sostanza, voglio ciclo attraverso questo e guardare ogni chiave e dire, "c'è un altro oggetto (persona in questo caso) la cui chiave è entro 1 dalla chiave corrente? Se è così, loro match up e rimuoverli dal la collezione." Io vado a iterare il valore "1" nell'esempio di cui sopra fino a quando la raccolta è vuota (o ha un oggetto rimanendo per gli scenari dispari).

Non sono convinto che il modo in cui sto cercando di andare su questo è il modo migliore, quindi sono aperto a commenti troppo.

È stato utile?

Soluzione

Si desidera un Multimap . Guava fornisce questa interfaccia e diversi subinterfaces quali ListMultimap, SetMultimap e SortedSetMultimap a seconda del tipo di raccolta che si desidera valori essere conservati in. quindi offre varie implementazioni, come ArrayListMultimap e HashMultimap, oltre a varie utlities per l'uso con loro in Multimaps .

Il modo tradizionale di fare questo in Java è qualcosa di simile Map<K, List<V>>, Map<K, Set<V>> ecc, ma mantenendo le collezioni valori è operazioni noiose e vari che dovrebbero essere semplici (come ad esempio solo mettendo un valore per una chiave) sono molto più complicate di quanto hanno bisogno di essere.

Multimap è inteso come una struttura di dati specificamente progettato per modellare più valori mappati in un singolo tasto (a differenza Map). Dato che, rende le operazioni semplici come ci si aspetterebbe:

ListMultimap<Integer, String> m = ArrayListMultimap.create();
m.put(4, "Bob");
m.put(5, "Mary");
m.put(5, "Sue");
...

for (String name : m.get(5)) { ... } // iterates ["Mary", "Sue"]

Se si voleva garantire lo stesso valore non viene mappata a un singolo tasto due volte e non si preoccupano l'ordine i valori sono in, è possibile utilizzare un SetMultimap invece di un ListMultimap, ecc.

Non sono sicuro di cosa si intende per quanto "c'è un altro oggetto la cui chiave è entro 1 dalla chiave corrente? Se è così, loro match up e rimuoverli dalla raccolta." Ma se sto leggendo bene, si potrebbe fare qualcosa di simile:

for (Integer key : m.keySet()) {
  Collection<String> people = m.get(key);
  Collection<String> peopleOneLower = m.get(key - 1); // empty if there are none
  ...
}

In alternativa si potrebbe fare qualcosa con un TreeMultimap<Integer, String> che avrà entrambi i suoi tasti SET valore insiemi ordinati.

Altri suggerimenti

Come su un Map<Integer, List<String>>, in una sorta di modalità di collisione-evitare. Sarebbe cambiare il set di dati per assomigliare:

 [4] => [Bob]
 [5] => [Mary, Sue]
 [9] => [Steve]
[10] => [Jason, Michelle]

Si dovrà modificare il codice iteratore un po '. Si potrebbe utilizzare gli indici degli elementi List come i loro "chiavi", e, naturalmente, che ci si deve aggiungere la logica per inizializzare il Map con le liste vuoti o fare in modo di controllare i valori Map per null. Sarà una sorta di dipenderà da come si genera la Map.

Che dire qualcosa del tipo:

IDictionary<int,IList<Person>> 

Devo admin, non al 100% seguo la logica di business, ma se si può avere più valori per un singolo tasto, qualcosa di simile a questo dovrebbe sostenerlo.

- Modifica - Ignorare questo - è stato sottolineato a me che questo è stato etichettato come una domanda java. Pertanto, la risposta con:

Map<Integer, List<String>>

è molto più appropriato.

Forse solo qualcosa come: Lista dove il CustomObject ha la vostra chiave e il valore e si ordina l'elenco in base alla chiave.

Dal momento che suona come voi li elaborano in ordine, penso che una mappa potrebbe essere eccessivo dal momento che ci si vuole scandire le chiavi in ??ordine ed essere la rimozione di elementi in coppie.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top