¿Qué tipo de objeto de Java (colección / lista / set / lo que sea) es lo que quiero para esto?

StackOverflow https://stackoverflow.com/questions/4348253

Pregunta

Quiero almacenar una colección de objetos que están codificados en base a un valor que representan. Estas teclas puede repetirse. por ejemplo:.

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

En esencia, quiero colocar a través de esto y vistazo a cada tecla y decir: "¿hay otro objeto (persona, en este caso) cuya clave es el plazo de 1 de la clave actual? Si es así, el partido para arriba y sacarlos de la colección." Voy a iterar el valor "1" en el ejemplo anterior hasta que la colección está vacía (o tiene un objeto restante para escenarios de número impar).

No estoy convencido de la forma en que estoy tratando de hacer esto es la mejor manera, así que estoy abierto a la retroalimentación también.

¿Fue útil?

Solución

¿Quieres una Multimapa . guayaba proporciona esta interfaz y varias subinterfaces como ListMultimap, SetMultimap y SortedSetMultimap dependiendo de qué tipo de colección que desea valores para ser almacenado en. a continuación, proporciona diversas implementaciones tales como ArrayListMultimap y HashMultimap, además de varios utlities para su uso con ellos en Multimapas .

La forma tradicional de hacer esto en Java es algo así como Map<K, List<V>>, Map<K, Set<V>> etc., pero el mantenimiento de las colecciones de valores son las operaciones tediosas y diversos que deben ser simples (como acaba de poner un valor de una clave) son mucho más complicadas de lo que necesitan ser.

Multimap pretende ser una estructura de datos específicamente diseñado para modelar múltiples valores asignados a una clave única (a diferencia de Map). Teniendo en cuenta que, hace operaciones tan simples como era de esperar:

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"]

Si usted quiere garantizar el mismo valor que no se asigna a una sola tecla dos veces y no se preocupan por el orden de los valores se encuentran, se puede utilizar un SetMultimap en lugar de un ListMultimap, etc.

No estoy seguro de lo que quiere decir por lo que "no es otro objeto cuya clave es el plazo de 1 de la clave actual? Si es así, el partido para arriba y sacarlos de la colección." Pero si estoy leyendo bien, se podría hacer algo como esto:

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

Alternativamente, usted podría hacer algo con un TreeMultimap<Integer, String> que tendrá tanto en su conjunto y de valor clave conjuntos ordenados.

Otros consejos

¿Qué tal un Map<Integer, List<String>>, en una especie de forma de colisión evitando. Sería cambiar el conjunto de datos para parecerse a:

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

Usted tendría que cambiar su código de iterador un poco. Se podría utilizar los índices de los elementos List como sus "claves", y por supuesto que tendría que añadir lógica para inicializar su Map con listas vacías o asegúrese de comprobar sus valores Map para null. De alguna manera dependerá de la forma en que se genera la Map.

¿Qué pasa algo como:

IDictionary<int,IList<Person>> 

Tengo a admin, no 100% sigo la lógica de negocio, pero si se puede tener varios valores para una sola tecla, algo como esto debería apoyarlo.

- Editar - No haga caso de esto - se señaló a mí que esto fue etiquetado como una cuestión de Java. Por lo tanto, la respuesta con:

Map<Integer, List<String>>

es mucho más apropiado.

Tal vez sólo algo como: Lista donde el CustomObject tiene su clave y valor y se ordena la lista por la clave.

Desde que suena como usted los está procesando el fin, creo que un mapa puede ser excesiva, ya que le desea iterar sobre las claves en orden y ser la eliminación de elementos en pares.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top