2011-04-13 19 views
10

Teniendo en cuenta este mapa¿Cómo seleccionar los primeros N elementos en Java TreeMap?

SortedMap<Integer, String> myMap = new TreeMap<Integer, String>(); 

En lugar de un bucle for es que hay una función de utilidad para copiar primeros artículos N a un mapa de destino?

+0

No lo he comprobado, pero no me sorprendería si alguna API de Google Java tuviera una sola línea para hacer eso :) – SyntaxT3rr0r

Respuesta

5

Tal vez, pero no como parte de la API estándar de Java. Y: la utilidad usaría un bucle adentro.

por lo que tendrá un bucle, pero usted puede crear su propia "utilidad" de hacerlo todo en un método estático en una clase de utilidad:

public static SortedMap<K,V> putFirstEntries(int max, SortedMap<K,V> source) { 
    int count = 0; 
    TreeMap<K,V> target = new TreeMap<K,V>(); 
    for (Map.Entry<K,V> entry:source.entrySet()) { 
    if (count >= max) break; 

    target.put(entry.getKey(), entry.getValue()); 
    count++; 
    } 
    return target; 
} 

La complejidad sigue siendo O (n) (Dudo, que uno puede lograr O (1)), sino que lo utilice como una herramienta sin "ver" el bucle:

SortedMap<Integer, String> firstFive = Util.putFirstEntries(5, sourceMap); 
6

Hay SortedMap.headMap(), sin embargo, debe pasar una clave para que el elemento suba. Se podría iterar N elementos sobre Map.keySet() para encontrarlo, por ejemplo .:

Integer toKey = null; 
int i = 0; 
for (Integer key : myMap.keySet()) { 
    if (i++ == N) { 
     toKey = key; 
     break; 
    } 
} 

// be careful that toKey isn't null because N is < 0 or >= myMap.size() 
SortedMap<Integer, String> copyMap = myMap.headMap(toKey); 
0

También puede utilizar un iterador ordored para obtener los primeros registros de x, orderer descendiendo Identificación por ejemplo:

Iterator<Integer> iterator = myMap.descendingKeySet().iterator(); 
6

Usando el poder de Java 8+:

TreeMap<Integer, String> myNewMap = myMap.entrySet().stream() 
    .limit(3) 
    .collect(TreeMap::new, (m, e) -> m.put(e.getKey(), e.getValue()), Map::putAll); 
Cuestiones relacionadas