2010-02-23 18 views
6

Estoy creando un TableModel que tendrá un número fijo de columnas, pero el número de filas cambiará (mayormente, aumentando como función del tiempo). Qué sería mejor enfoque para almacenar los datos,ArrayList de matrices vs. array de ArrayLists vs. algo similar

ArrayList[] columns = new ArrayList[numberOfColumns]; 
// Each array element is one column. Fill each of them with a new ArrayList. 
... 
public Object getValueAt(int row, int column) { 
    return columns[column].get(row); 
} 

es decir, la creación de una matriz de ArrayList s, cada ArrayList que representa una columna, o:

ArrayList<Object[]> rows = new ArrayList<Object[]>(); 
// Each ArrayList element is one row. 

public Object getValueAt(int row, int column) { 
    return rows.get(row)[column]; 
} 

es decir, la creación de uno ArrayList que mantiene las matrices, cada uno de que representan una fila

¿Alguna idea de cuál de estos es más eficiente en términos de velocidad o almacenamiento? La alternativa 1 requiere extender N ArrayList s con cada fila agregada, mientras que la alternativa 2 requiere extender solo un ArrayList pero también crear una nueva matriz de longitud N (para representar la nueva fila). ¿O hay una solución obvia, mejor?

+0

Buena pregunta. ¿Desea poder cambiar fácilmente el número de filas y/o columnas? Además, ¿desea permitir que las filas tengan columnas de longitud variable? Editar: mi mal, no leí completamente la primera parte de su pregunta. – Tom

+0

Sí, el número de columnas es fijo, pero el número de filas está cambiando. –

Respuesta

6

Si se fija el número de columnas, sus datos probablemente estén orientados a filas o al menos a una variable de fila, en cuyo punto cada fila debería ser una matriz. El número fijo de columnas significa que no necesita reasignar su matriz.

Por lo que su estructura es:

List<Object[]> rows; 

donde el elemento de la matriz es una fila.

Hay varias opciones para lo que su objeto de fila debe ser sin embargo:

  1. Una matriz;
  2. A List u otra Collection; o
  3. Un objeto personalizado.

(3) probablemente se puede hacer utilizando algún tipo de interfaz que le permita consultar el número, tipo y nombre de las columnas.

+0

Gracias, creo que esta es la solución más limpia después de todo. –

+0

Por supuesto, hacer la matriz de Objetos provocará el encajamiento y el desempaquetado de los datos que se colocan en ella. Esa es una gran desventaja. –

2

Cómo sobre el uso una sola ArrayList sí y acceder elemento como este

public Object getValueAt(int row, int column) { 
    return data.get(row*NUMBER_OF_COLUMNS+column); 
} 

En este caso, cada objeto ArrayList es una celda de una tabla. Y no es necesario exigir a cualquier otra estructura adicional

+0

Esta podría ser la alternativa más eficiente, aunque no la más legible. –

+0

Legible en caso de 'legibilidad de código'? – vpram86

+0

Quiero decir que, por ejemplo, eliminar filas requiere calcular índices adecuados para 'datos', lo que requiere un poco de reflexión, y arruinarlo una vez y toda la estructura de datos se arruina :-) Y comprender ese código requiere un poco más de esfuerzo, pero no mucho, de todos modos. –

1

Me gustaría ir con la opción # 2 por varias razones

En primer lugar, las matrices tienen una longitud fija mientras que ArrayList son flexibles. Dado que tus #columnas son correcciones, parece natural tener una matriz por fila.

La opción n. ° 1 es peligrosa porque incurre en el requisito implícito de que todas las ArrayLists tengan la misma longitud. Puede omitir accidentalmente agregar a cualquiera de ellos creando un error. No tendrá este problema en la opción n. ° 2.

Por último, parece que la convención común es que primero indices las filas y solo las columnas.

1

Personalmente, me gustaría una ArrayList de arreglos de longitud fija.Si está hablando de una gran cantidad de filas, esto puede ser más eficiente en el uso del espacio (y tal vez más rápido) que la asignación de un montón de ArrayLists, que comienza respaldado por una matriz de longitud 10. Por lo tanto, si tiene menos columnas que 10 terminarás con espacio perdido. Por otro lado, si tiene más, ArrayList tendrá que cambiar el tamaño de su matriz de respaldo cuando agregue columnas adicionales.

Editar: de hecho, se puede establecer la capacidad en el constructor de ArrayList, así que supongo que no puede hacer mucha diferencia: http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html