2010-01-12 14 views
11

Quiero utilizar una colección en lugar de una matriz 2D para no tener que dar su tamaño en el momento de la declaración y puedo agregar tantos elementos como quiera dinámicamente.¿Qué colección utilizar en lugar de matriz 2D en Java?

+1

¿Qué patrones va a utilizar para acceder a los elementos en la matriz? Acceso aleatorio, una fila completa, una columna completa? –

Respuesta

7

El problema con List> es que debe redimensionar cada fila si desea redimensionar su matriz.

Si desea utilizar una matriz dispersa, o tal vez una matriz infinita se puede hacer algo como:

class SparseMatrix<X> { 
    private Map<Coord, X> values = new HashMap<Coord, X>(); 

    public SparseMatrix() { 
    } 

    public X get(int x, int y) { 
    return values.put(new Coord(x,y)); // null if there's no value 
    } 

    public void set(int x, int y, X value) { // you can use null (like in a List) 
    values.set(new Coord(x,y), value); 
    } 

    private static class Coord { 
    int x; int y; 
    public Coord(int x, int y) { 
     this.x = x; 
     this.y = y; 
    } 

    @Override 
    public boolean equals(Object other) { 
     if (other instance of Coord) { 
      Coord o = (Coord) other; 
      return o.x == x && o.y == y; 
     } 
     return false; 
    } 

    @Override 
    public int hashCode() { 
     return o.x + o.y; // or some more clever implementation :) 
    } 

    } 
} 

Editar:Apache Commons HashCodeBuilder es una gran herramienta para generar códigos hash.

+1

Su hashCode puede desbordarse, sin embargo * usted * lo ha comentado en consecuencia ... :) – Esko

+0

Vista nítida !!! Hay un método de utilidad: java.util.Arrays.hashCode (int []) que crea un código hash para int [] pero, por supuesto, no sería bueno crear una matriz cada vez que se necesita hashChode (o tener creó). Tal vez podríamos copiar su implementación solo para dos enteros: (31 + o.x) * 31 + o.y. Pero parece desbordarse de todos modos ... (Creo que no importa, ¿es cíclico?). – helios

+0

¿Importa en el hashCode() que x + y == y + x? – Adam

0

Personalmente estoy usando la clase Vector para ese propósito, aunque diferentes requisitos pueden eventualmente dictar el uso de otras clases más especializadas.

+0

El vector está prácticamente obsoleto y ha sido reemplazado por ArrayList. – Yoni

+2

@mortiz - 'java.util.Vector' generalmente se debe evitar: su seguridad de subprocesos no es muy útil para la mayoría de los escenarios de subprocesos múltiples y solo agrega sobrecarga al uso de subprocesos únicos. La mayoría de las personas usan 'ArrayList' como su tipo' List' predeterminado en su lugar. – McDowell

+0

aprendí algo, gracias! – moritz

0

java.util.ArrayList es mi elección preferida.

http://java.sun.com/j2se/1.5.0/docs/api/java/util/ArrayList.html

+0

Creo que se usa cuando queremos tener una matriz 1-D dinámica –

+0

Puede tener una ArrayList que cada uno de sus elementos sería otra ArrayList (como lo proponemos rsp y yo en nuestras respuestas). De esta forma, una ArrayList también se puede usar para matrices 2D. – Alex

0

importación java.util.ArrayList;

ArrayList es lo que desea, no es necesario para establecer su tamaño en tiempo de creación y se puede añadir elementos de forma dinámica utilizando el método add.

2

La forma más sencilla es utilizar colecciones anidadas ... digamos (suponiendo que sus valores son cadenas) List<List<String>> que luego pueden ser utilizados como esto:

List<List<String>> fakeArray = new ArrayList<List<String>>(); 

// Pretend you fill it with values between these calls 
String retrieve = fakeArray.get(0).get(0); 

Editar: Este fue originalmente un Map<String,List<String>> lo que realmente doesn' tiene sentido en este contexto.

Sin embargo, es posible que desee ver si Google Collections o Apache Commons Collections tienen algo más especializado que puede utilizar.

0

Depende de lo que intente hacer, pero yo recomendaría ArrayList. Es más rápido que Vector. ¡A menos que te importe la sincronización! Si lo quiere como una lista bidimensional, crea una ArrayList y cada elemento de esta lista sería otra ArrayList.

0

Podría hacer una prueba con ArrayList teniendo ArrayList s como elementos. Si eso no hace lo que quieres, te dará instinto en lo que necesitas para construirte.

2

¿Qué quieres que se haga con él? Probablemente usaría simplemente un Collection<Collection<Element>> (donde Collection podría ser reemplazado por List).

O puede crear su propia clase con métodos para iterar sobre filas o columnas o todos los elementos según sea necesario.

0

Depende de la forma en que desee utilizar la estructura de datos. Sus opciones son:

  • Dos listas; es tu trabajo sincronizar entre ellos.
  • Un mapa; en lugar de una relación clave-valor, las entradas de su mapa simplemente serán tuplas de objetos.
  • Una lista de matrices de objetos de 2 celdas; cada elemento de la lista será una matriz objeto de tamaño 2.

EDIT: I leído mal completamente la pregunta; Pensé que se trataba de una matriz 2D de ancho 2.

Después de haber leído correctamente la pregunta (espero :-)), estoy de acuerdo con los que dijeron lista de listas.

Cuestiones relacionadas