2012-04-05 8 views
6

Llamo a una API que me devuelve una colección de objetos. Quiero obtener un subconjunto de los objetos. Hay dos soluciones que estoy pensando. ¿Cuál me daría un mejor rendimiento? De acuerdo con mi entendimiento, la llamada toArray() se repetirá principalmente a través de la colección una vez. Si eso es cierto, ¿entonces la solución sería mejor?¿Debo iterar una colección de Java para obtener un subconjunto, o debo convertirlo a una matriz primero y luego iterar para obtenerlo?

Solución 1 -

public static List<String> get(UUID recordid, int start, int count) { 
    List<String> names = new ArrayList<String>(); 

    ... 

    Collection<String> columnnames = result.getColumnNames(); 
    int index = 0; 
    for (UUID columnname : columnnames) { 
     if ((index >= start) && (index - start < count)) { 
      names.add(columnname); 
     } 
     index++; 
    } 

    return names; 
} 

Solución 2 -

public static List<String> get(UUID recordid, int start, int count) { 
    List<String> names = new ArrayList<String>(); 

    ... 

    Collection<String> columnnames = result.getColumnNames(); 
    String[] nameArray = columnnames.toArray(new String(columnnames.size())); 

    for (int index = 0; index < nameArray.length && count > 0; index++, count--) { 
     names.add(nameArray[index]); 
    } 

    return names; 
} 
+0

¿Qué le parece usar 'subList'? – assylias

+2

suena como si estuviera recibiendo una 'Colección' no necesariamente una' Lista' – ulmangt

Respuesta

7

Definitivamente, iterar a través de una colección es mejor que la conversión de un array primero, y luego iterar a través de la matriz.

El segundo enfoque proporciona con el tiempo y la memoria gastos extras:

  1. de asignación de memoria para una matriz
  2. Llenar la matriz con contenido de la colección
18

Si su colección es una lista, puede usar el método subList(fromIndex, toIndex).

Ejemplo:

List<String> x = new ArrayList<String>(); 
List<String> y = x.subList(5, 10); 
+0

No sabemos si se trata de una 'Lista', ¿no es una' Colección', creo? –

+0

Oh, tienes razón, salté esa línea -.- – SWoeste

2

creo que la respuesta subLista es el camino a seguir.

public static List<String> get(UUID recordid, int start, int count) { 
    Collection<String> columnnames = result.getColumnNames(); 
    List<String> names = new ArrayList<String>(columnnames); 
    return names.subList(start, start+count); 
} 
0

Si tiene una lista, utilice el método subList. Aquí hay un ejemplo de hacerlo:

private static void doTestListBreak() 
{ 
    for (int i=0; i<= 300; i++) 
    { 
     for (int delta=1; delta<= 30; delta++) 
     { 
      testListBreak(i, delta); 
     } 
    } 
} 

public static void testListBreak(int numItems, int delta) 
{ 
    if (delta <= 0) 
     return; 

    log("list(" + numItems + "): "); 
    List<Integer> list = new ArrayList<Integer>(); 
    for (int i=0; i < numItems; i++) 
    { 
     list.add(i); 
    } 

    for (int i=0; i < list.size(); i=i+delta) 
    { 
     int max = Math.min(list.size(), i + delta); 
     List<Integer> subList = list.subList(i, max); 
     log("list(" + numItems + "," + delta + "): " + subList); 
    } 
} 

public static void log(String msg) 
{ 
    System.out.println(msg); 
} 
Cuestiones relacionadas