2010-09-04 32 views
35

Quiero crear una matriz multidimensional sin un tamaño fijo.Java ArrayList of Arrays?

Necesito poder agregar elementos de String[2] a él.

He intentado buscar en:

private ArrayList<String[]> action = new ArrayList<String[2]>(); 

pero eso no quiere trabajar. ¿Alguien tiene alguna otra idea?

Respuesta

66

Debe ser

private ArrayList<String[]> action = new ArrayList<String[]>(); 
action.add(new String[2]); 
... 

no puede especificar el tamaño de la matriz dentro del parámetro genérico, sólo se suman las matrices de tamaño específico a la lista más adelante. Esto también significa que el compilador no puede garantizar que todas las sub-matrices sean del mismo tamaño, usted debe asegurarlo.

Una mejor solución podría ser encapsular esto dentro de una clase, donde puede garantizar el tamaño uniforme de las matrices como un tipo invariante.

3
ArrayList<String[]> action = new ArrayList<String[]>(); 

No necesita String[2];

-1
  1. Cree la lista de arreglos como ArrayList action.

    En JDK 1.5 o superior, utilice ArrayList <string[]> nombre de referencia.

    En JDK 1.4 o inferior use ArrayList nombre de referencia.

  2. Especificar los especificadores de acceso:

    • pública, se puede acceder en cualquier lugar
    • privada, alcanzada dentro de la clase
    • protegido, visitada dentro de la clase y el paquete de diferentes subclases
  3. A continuación, especifique la referencia que se asignará en

    action = new ArrayList<String[]>(); 
    
  4. En JVM new palabra clave asignará memoria en tiempo de ejecución para el objeto.

    No debe asignar el valor declarado, porque está preguntando sin tamaño fijo.

  5. Finalmente, puede utilizar el método add() en ArrayList. Use como

    action.add(new string[how much you need]) 
    

    Asignará el área de memoria específica en el montón.

10

BTW. deberías preferir codificar contra una interfaz.

private ArrayList<String[]> action = new ArrayList<String[]>(); 

En caso de ser

private List<String[]> action = new ArrayList<String[]>(); 
+2

+1 estuvo de acuerdo. Además, generalmente debe declararse final. Hay muy pocos casos de uso para volver a vincular una variable de contenedor. – dsmith

+0

¿Por qué es esto así? – athena

+2

@athena: Vea la primera pregunta y su respuesta en esta entrevista de Erich Gamma: http://goo.gl/fz9G – missingfaktor

4

Dado que el tamaño de la matriz de cadenas se fija en tiempo de compilación, que sería mejor usar una estructura (como Pair) que los mandatos de exactamente dos campos, y por lo tanto evite los errores de tiempo de ejecución posibles con el enfoque de matriz.

Código:

Dado que Java no proporciona una clase Pair, tendrá que definir su propio.

class Pair<A, B> { 
    public final A first; 
    public final B second; 

    public Pair(final A first, final B second) { 
    this.first = first; 
    this.second = second; 
    } 

    // 
    // Override 'equals', 'hashcode' and 'toString' 
    // 
} 

y luego usarlo como:

List<Pair<String, String>> action = new ArrayList<Pair<String, String>>(); 

[Aquí he utilizado List porque se considera una buena práctica para programar a las interfaces. ]

+1

+1 Estaba a punto de dar la misma respuesta.Hubo mucho debate sobre si se necesita una clase java.util.Pair. Creo que sí. – dsmith

+0

De acuerdo en cierta medida: una clase de par que ha proporcionado es un gran comienzo y es una buena generalización ya que me parece que las colecciones/matrices que contienen otras colecciones/matrices son un olor a código. Sin embargo, en este caso, es bastante probable que los dos Strings the OP se apareen juntos probablemente tengan alguna relación especial entre sí, y en tal caso probablemente merezca una clase propia que especifique esa relación (y contenga métodos específicos para el par). Podría ser una subclase de Pair por supuesto. – whaley

+0

Java tiene java.util.Map.Pair. No es necesario definir tu propio. – emory

3

Como ya se ha respondido, puede crear un ArrayList de String Arrays como @ Péter Török escrito;

//Declaration of an ArrayList of String Arrays 
    ArrayList<String[]> listOfArrayList = new ArrayList<String[]>(); 

Al asignar diferentes matrices de cadenas a este ArrayList, la longitud de cada matriz de cadenas será diferente.

En el siguiente ejemplo, se agregaron 4 Array of String diferentes, sus longitudes son variables.

String Array #1: len: 3 
String Array #2: len: 1 
String Array #3: len: 4 
String Array #4: len: 2 

El código de demostración es el siguiente;

import java.util.ArrayList; 

public class TestMultiArray { 

    public static void main(String[] args) { 
     //Declaration of an ArrayList of String Arrays 
     ArrayList<String[]> listOfArrayList = new ArrayList<String[]>(); 

     //Assignment of 4 different String Arrays with different lengths 
     listOfArrayList.add(new String[]{"line1: test String 1","line1: test String 2","line1: test String 3"} ); 
     listOfArrayList.add(new String[]{"line2: test String 1"} ); 
     listOfArrayList.add(new String[]{"line3: test String 1","line3: test String 2","line3: test String 3", "line3: test String 4"} ); 
     listOfArrayList.add(new String[]{"line4: test String 1","line4: test String 2"} ); 

     // Printing out the ArrayList Contents of String Arrays 
     // '$' is used to indicate the String elements of String Arrays 
     for(int i = 0; i < listOfArrayList.size(); i++) { 
      for(int j = 0; j < listOfArrayList.get(i).length; j++) 
       System.out.printf(" $ " + listOfArrayList.get(i)[j]); 

      System.out.println(); 
     } 

    } 
} 

Y la salida es la siguiente;

$ line1: test String 1 $ line1: test String 2 $ line1: test String 3 
$ line2: test String 1 
$ line3: test String 1 $ line3: test String 2 $ line3: test String 3 $ line3: test String 4 
$ line4: test String 1 $ line4: test String 2 

Además, notifique que puede inicializar una nueva matriz de Sting como se muestra a continuación;

new String[]{ str1, str2, str3,... }; // Assuming str's are String objects 

Así que esto es lo mismo con;

String[] newStringArray = { str1, str2, str3 }; // Assuming str's are String objects 

He escrito esta demostración sólo para demostrar que no es el ArrayList objeto, todos los elementos son referencias a diferentes instancias de la cadena matrices, por tanto, la longitud de cada uno de matrices de cadenas no tienen que ser los mismos , tampoco es importante.

Una última nota: Será una buena práctica usar ArrayList dentro de una interfaz de lista, en lugar de la que ha utilizado en su pregunta.

Será mejor utilizar la interfaz de Lista como a continuación;

//Declaration of an ArrayList of String Arrays 
    List<String[]> listOfArrayList = new ArrayList<String[]>();