2010-11-02 15 views
11

¿Qué estructura para utilizar cuando se necesitaOrdenado Mapa con las teclas no únicos

  1. ordenamiento de los elementos por la clave
  2. capacidad de mantener las llaves no únicos

    Structure<Integer, String> struct = new Structure<Integer, String>; 
    struct.add(3,"..."); 
    struct.add(1,"John"); 
    struct.add(2,"Edwin"); 
    struct.add(1,"Mary"); 
    struct.toString() == {key-> value;} [1->"John",1->"Mary",2->"Edwin",3->"..."] 
    

Respuesta

11

Si Si desea utilizar la API estándar de Java, elegiría un TreeMap<Integer, Set<String>>.

  • Los elementos están ordenados por las teclas ya que es un SortedMap. De los documentos:

    El mapa se ordena de acuerdo con el orden natural de sus claves, o por un Comparador normalmente proporcionado en el momento de creación del mapa ordenado. Este orden se refleja al iterar sobre las vistas de colección del mapa ordenado (devuelto por los métodos entrySet, keySet y values).

  • La estructura permite claves no exclusivas, ya que puede dejar que una tecla se asigne a múltiples objetos.

Este tipo de estructura se denomina ordenados multi-mapa y hay varias implementaciones que ocultan los detalles de la creación de conjuntos iniciales cuando se inserta por primera vez, etc. echar un vistazo a GuavaApache Commons o, por ejemplo, .

Dependiendo de sus necesidades, también podría tener un SortedSet<Pair<Integer, String>>, donde los elementos se ordenan en el elemento izquierdo del par. (Tenga en cuenta que debería haber escrito la clase Pair usted mismo, pero no debería ser más que unas pocas líneas.)

+0

gracias por una respuesta completa – EugeneP

5

Parece que necesita quizás un Map<Integer, List<String>> para que cada tecla se corresponda con una lista (u otra colección) de instrumentos de cuerda.

Apache Commons tiene MultiMap, que hace lo anterior sin la molestia de codificarlo.

MultiMap mhm = new MultiHashMap(); 
mhm.put(key, "A"); 
mhm.put(key, "B"); 
mhm.put(key, "C"); 
Collection coll = (Collection) mhm.get(key); 

coll será una colección que contenga "A", "B", "C".

Google Collections proporcionará algo similar, sospecho.

+0

gracias por una respuesta completa – EugeneP

2

Además de usar implementaciones multimapa de Apache Commons o Guava, o implementar una clase Pair como lo sugieren otras respuestas, simplemente puede usar un TreeMap<Integer,List<String>>. En lugar de una asignación de teclas a un único String, ahora se asigna a un List que puede contener múltiples valores y, por lo tanto, funciona de manera efectiva como un multimapa.

Pero me gustaría ir con un multimap adecuado para el código de producción.

Cuestiones relacionadas