diferencia - arraylist java example
ArrayList de matrices vs. array de ArrayLists vs. algo similar (4)
Estoy creando un modelo de tabla que tendrá un número fijo de columnas, pero el número de filas cambiará (en su mayoría, aumentando en función del tiempo). ¿Cuál sería el mejor enfoque para almacenar los datos,
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
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 una ArrayList que contiene matrices, cada una de las cuales representa 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
con cada fila agregada, mientras que la alternativa 2 requiere extender solo una ArrayList
pero también crear una nueva matriz de longitud N (para representar la nueva fila). ¿O hay una solución obvia, mejor?
¿Qué tal si usamos una sola ArrayList y accedemos a un 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 en una tabla. Y no necesita ninguna otra estructura adicional
Me gustaría ir con la opción # 2 por varias razones
Primero, las matrices tienen una longitud de arreglos, mientras que las 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.
Finalmente, parece que la convección común es que primero indexas las filas y solo luego las columnas.
Personalmente, elegirí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: en realidad, puedes establecer la capacidad en el constructor de ArrayList, así que supongo que no hará mucha diferencia: http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html
Si se fija el número de columnas, entonces 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.
Entonces tu estructura es:
List<Object[]> rows;
donde el elemento de matriz es una fila.
Sin embargo, hay varias opciones para lo que debería ser su objeto de fila:
- Una matriz;
- Una
List
u otraCollection
; o - Un objeto personalizado.
(3) probablemente se puede hacer mediante el uso de algún tipo de interfaz que le permite consultar el número, tipo y nombre de las columnas.