2010-11-23 17 views
18

Pregunta es cuánto cuesta crear una lista de arreglos de una colección HashMap.values ​​()? O creando los valores Colección solo? Asumiendo Map.size()> 100k. Los objetos también se pueden mantener en ArrayList (en lugar de HashMap) todo el tiempo, lo que tiene implicaciones en otras partes (modificaciones de los elementos, fácil por clave). ArrayList se usa para iterar sobre cada n-ésimo elemento. (Es por eso que la colección de valores no se puede usar directamente). No se realizan modificaciones durante la iteración.Rendimiento: Creación de una lista de arreglos de HashMap.values ​​()

+0

La pregunta no está clara. No entendí. – Emil

+2

Cuando habla de "costo", ¿quiere decir, tiempo o memoria? – Ralph

Respuesta

2

Puede usar un Iterator para omitir elementos: simplemente llame al next() muchas veces.

Crear una lista de cualquier colección tiene una complejidad lineal.

+0

tiene sentido. Entonces uso iterator y llamo it.next() en un ciclo for porque muchas veces es un parámetro. –

+0

sí (15 caracteres ...) – Bozho

0

Puede crear su propio HashMap, que contiene la colección de valores del Arraylist directamente (no creo que HashMap lo haga de forma gratuita, la estructura de datos para él es diferente). Pero esto requiere una codificación adicional de su lado.

7

HashMap almacena internamente los valores en una Colección values. Eche un vistazo al source code de AbstractMap, el padre de HashMap.

So HashMap.values() devuelve directamente un Collection. No se realizan cómputos ni copias de datos. Es tan rápido como puede ser.

sólo obtener los valores y luego hacer un bucle for:

int n = 5; // every 5th element 
Object[] values = hashMap.values().toArray(); 
int size = values.length; 
for (int i = 0; i < size; i += n){ 
    values[i]; 
    // do something 
) 
34

HashMap.values() no devuelve un ArrayList de valores, sino una colección Values.

Fuente:

public Collection<V> values() { 
     Collection<V> vs = values; 
     return (vs != null ? vs : (values = new Values())); 
    } 

Values es un AbstractCollection. El motivo de los valores es solo hacer referencia al iterador de HashMap.

Su pregunta:

La pregunta es cuánto cuesta a crear un ArrayList de una HashMap.values ​​() Collection?

Esa es una complejidad lineal (como se dijo Bozho) desde

ArrayList<V> valuesList = new ArrayList<V>(hashMap.values()); 

la ArrayList, valuesList llama a la colección hashMaptoArray() método que esencialmente hace un bucle for de elemento 0..N (tamaño) en el colección.

Espero que esto ayude.

3

Para explicar la solución de @ Bozho, puede hacerlo.

int count = 0; 
for(Value value: map.values()) 
    if(count++ % 5 == 0) 
    // do something. 
Cuestiones relacionadas