2008-12-03 12 views
5

Esto debería ser fácil para muchos de ustedes, pero para mí es solo otro poco de oxidación que debe ser eliminada al volver a la codificación básica de Java. Usar arrays asociativos sangrientos durante tanto tiempo en otros idiomas me ha vuelto agradable y mimada. : PBrushup de estructura de datos (Java)

Mi problema es simple: estoy almacenando un conjunto de objetos, cada uno con una cadena y un número, en una lista. Me gustaría que cada objeto insertado en esta lista se ordene alfabéticamente por su cadena. También me gustaría poder recuperar objetos de la lista por su cadena también. Me gustaría hacer esto de la manera más formal y/o eficiente posible.

¿Hay algo disponible en las bibliotecas estándar de Java para esto?

+0

Sorprendentemente, los Javadocs proporcionan información decente sobre el uso y el rendimiento de las estructuras de datos disponibles. Si busca las interfaces Mapa, Conjunto y Lista, lo guiarán a las diversas implementaciones disponibles. No sé qué versión estás usando, así que no me vinculé directamente. –

Respuesta

8

hay una gran writeup on java collections que cubre la mayoría de sus necesidades.

consejos breves sobre esto: utilice un TreeMap (Comparador c) con un Comparador personalizado. clave no está en la cadena de valor es el objeto compuesto con una cuerda y número

+0

Gracias por su enlace a las colecciones de Java. He estado buscando algo en Java comparable a la descripción de Strostrup del C++ STL, y parece que es así. – Rich

3

Eso suena como SortedMap. Con la cadena como la clave y el número como el valor.

+0

Ah bien. Gracias. Eso fue más fácil de lo que esperaba. –

+0

Parece que SortedMap es una interfaz que debe implementarse, dicho sea de paso (lo que parece hacer TreeMap). –

2

Además del SortedMap, puede tener un

TreeSet<Pair<String, Number>>
en el que le proporcione el comparador para ordenar los pares (o haga que su clase Pair implemente el Comparable y hágalo allí).

Esto evita que los objetos se separan de la estructura de datos, y al mismo tiempo para un ejemplo trivial como esto no es un gran problema, se puede imaginar que un MiObjeto > TreeSet < donde MiObjeto implementa Comparable es más fácil de asimilar en el largo término.

+0

Creo que vale la pena escribir algunas pruebas ¡eh, ahora tiene sugerencias SortedMap, TreeSet y TreeMap! Creo que TreeXYZ será más rápido para obtener un iterador, los mapas serán más rápidos para la inserción/recuperación. Entonces, quizás TreeMap es la mejor opción en general. – JeeBee

+0

Puedo hacer eso después de terminar de leer sobre ellos. Gracias. –

+0

@JeeBee: TreeMap es el único Mapa que implementa la interfaz SortedMap en la API estándar de Java. – Powerlord

1

Si tiene valor de cadena duplicado entre los objetos de la lista, es posible que desee mirar a Google Collections' TreeMultimap. Con TreeMultimap, no solo las claves están ordenadas, sino que todos los valores que tienen la misma clave también se almacenan en una colección.

Multimap<String, Pair> mm = new TreeMultimap<String, Pair>(
     new Comparator<String>(){...}, 
     new PairComparator()); 
mm.put("A", new Pair("A", 1)); 
mm.put("B", new Pair("B", 2)); 
mm.put("B", new Pair("B", 3)); 
Collection values = mm.values(); 
    // values are [Pair("A", 1), Pair("B", 2), Pair("B", 3)] 
Collection bValues = mm.get("B"); 
    // bValues are [Pair("B", 2), Pair("B", 3)] 
-1

he hecho algo similar a eso, he usado ArrayList para almacenarlos objetos y escribir comparadores para clasificar el ArrayList.

Cuestiones relacionadas