2011-03-10 6 views
5

Sé que es posible crear una ArrayList 2D con ArrayList<ArrayList<E>>, pero eso es engorroso y una pesadilla de lanzamiento real cuando se trata de agregar y recuperar objetos.¿Existen clases eficaces ArrayList 2D para Java?

¿Hay clases ArrayList en 2D que hacen este tipo de cosas de manera más eficiente? Escribo una verdadera clase 2D ArrayList desde cero, y me pregunto si hay alguien más que haya hecho este tipo de cosas de manera eficiente.

+0

¿En qué necesita más eficiencia? – jjnguy

+0

Eficiencia en general. Hay pseudo clases ArrayList que usan LinkedLists, ArrayLists anidadas, o simplemente arreglos multidimensionales, que pueden ser terriblemente ineficientes en cuanto a velocidad y memoria. –

Respuesta

4

no, desafortunadamente no hay 2d clase ArrayList. sus opciones alternativas son (en el caso de la 0/1/2 Diamension es constante):

MyType[][] myList = new MyType[n][m]; 

o

ArrayList<MyType>[] myList = new ArrayList<MyType>[n]; 

o

ArrayList<ArrayList<MyType>> myList = new ArrayList<ArrayList<MyType>>(); 

otra opción es guardar todos sus datos en 1d ArrayList y crea una función que recibe (x, y) y devuelve el lugar x en ArrayList. de esta manera usted demuestra fuera de una matriz 2d, pero guarda los elementos fácilmente en 1d ArrayList

+0

+1 para "otra opción" –

1

Usar el enfoque tipo "ArrayList>" es bueno y bastante estándar para este tipo de cosas de lo que he visto. Puede escribir fácilmente una clase de lista de matriz 2D que proporcione métodos de conveniencia para agregar/eliminar elementos, etc., y no será "engorroso" o "una pesadilla de lanzamiento" usar esto. Eche un vistazo a la implementación this como un ejemplo. No es del todo perfecto, pero ilustra lo fácil que es usar este tipo de enfoque.

0

Google Collections tiene una colección Table. Se presenta como filas/columnas y es accesible directamente, bycol y por filas. Diferentes implementaciones de la tabla tienen diferentes eficiencias basados ​​en el acceso de tipo

0

he construido una estructura de datos "rejilla" en 3D, si se trata de ninguna ayuda.

El truco clave es sub-división del espacio en "bloques" para que los datos dispersos se pueden almacenar de manera eficiente.

Puede utilizarlo como una colección 2D si lo desea, haciendo caso omiso de la dimensión z (manteniéndola en 0), aunque es probable que sea un poco exagerado. Aún así, una opción si quieres este tipo de estructura. Alternativamente, podrías simplificarlo hasta 2D.