2011-03-12 38 views
5

Mi aplicación utiliza un TreeMap para mantener los datos ordenados y tener log (n) búsquedas & inserciones. Esto funciona muy bien en el caso general mientras la aplicación se está ejecutando, pero cuando la aplicación se inicia por primera vez, necesito inicializar el TreeMap con varios millones de longs que obtengo en el orden ordenado (ascendente).¿Cómo inicializar un TreeMap con datos ordenados previamente?

Puesto que estos valores de inicialización son ya ordenados, ¿hay alguna manera de insertarlos en el TreeMap sin pagar el log (n) el costo de la inserción del árbol y volver a equilibrar?

+0

Estaría muy sorprendido si lo hubiera, personalmente. – corsiKa

+0

¿Cuál es la estructura de datos de 'valores de inicialización'? ¿Lista? o HashMap? –

Respuesta

10

Sure! El método TreeMap.putAll (y el constructor TreeMap que toma SortedMap) llama internamente a un método llamado buildFromSorted, que se describe en los documentos como: "Algoritmo lineal de creación de árbol de tiempo a partir de datos ordenados", por lo que parece que hace lo que usted desea.

Simplemente proporcione el método putAll algo que implemente Map, pero donde el iterador de enrutamiento del mapa (Map.entrySet().iterator()) devuelve su lista de valores ordenados.

+0

Gracias, esto es exactamente lo que necesitaba, aunque tomará algunas discusiones para convertir mi lista de números de inicialización en algo que se parece a un SortedMap. –

+0

Puede que en realidad no. Edité la respuesta para decir "Use LinkedHashMap": puede poner sus números en ese orden y el iterador conservará el orden en que los agregó. – Neil

+2

LinkedHashMap no implementa la interfaz SortedMap, por lo que no creo que se use el método buildFromSorted. En cambio, tuve que crear una implementación anónima de SortedMap, una implementación anónima de Set inside that, una implementación anónima de iterator dentro de eso y una implementación anónima de Entry dentro de eso. Feo y detallado como el pecado, pero hace el trabajo. –

Cuestiones relacionadas