La forma más rápida de vaciar un hashmap al disco en un conjunto ordenado

Tengo un Map<byte[], Element>y quiero ordenarlo y escribirlo en el disco, de modo que tenga un archivo con todos los elementos ordenados por clave a través de Guava's UnsignedBytes.lexicographicalComparator.

Lo que estoy haciendo ahora es:

HashMap<byte[], Element> memory;

// ... code creating and populating memory ...

TreeMap<byte[], Element> sortedMap = new TreeMap<byte[], Element>(UnsignedBytes.lexicographicalComparator());
sortedMap.putAll(memory.getMap());

MyWriter writer = new MyWriter("myfile.dat");
for (Element element: sortedMap.values())
    writer.write(element);
writer.close();

Probablemente sea difícil acelerar la clasificación (O (nlogn)), la pregunta es si puedo mejorar la navegación de la lista ordenada. Idealmente , ordenaría un en ArrayListlugar de un TreeMap, de modo que recorrerlo sería muy rápido.

Pensé en poner el HashMap en un ArrayListy Collections.sort(), pero eso requeriría más copia que la solución real.

¿Algunas ideas?

Editar:

Agrego aquí mi prueba con la ArrayListcual es 2 veces más rápida, pero supongo que usa más memoria. Tal vez algunos comentarios sobre esta suposición?

// ArrayList-based implementation 2x faster
ArrayList<Element> sorted = new ArrayList<Element>(memory.size());
sorted.addAll(memory.values());

final Comparator<byte[]> lexic = UnsignedBytes.lexicographicalComparator();

Collections.sort(sorted, new Comparator<Element>(){
    public int compare(Element arg0, Element arg1) {
        return lexic.compare(arg0.getKey(), arg1.getKey());
    }
});
MyWriter writer = new MyWriter(filename);

for (Element element: sorted)
    writer.write(element);
writer.close();
Respuesta 1

Usando Eclipse, ¿cómo puedo encontrar qué clases de Java implementan la interfaz A y la interfaz B? Gracias.

En Nhibernate tenemos Nhibernate Fluent y, ahora, la función incorporada "Mapeo por código" en Nhibernate 3.2. Ambos le permiten construir mediante programación las asignaciones para su dominio y podríamos ...

Estoy creando un mapa isométrico con mosaicos simples, y he extendido RelativeLayout para crear un diseño que contenga estos mosaicos. Realmente, solo usar un RelativeLayout as-is funcionó bien siempre que mi ...

El protocolo almacena los estados del tutorial de Java: una característica clave proporcionada por las clases de mensajes de protocolo es la reflexión. [...] Una forma muy útil de usar la reflexión es convertir mensajes de protocolo a y ...