2010-10-29 19 views
5

¿alguien puede decirme el error en esta declaración java String[][] t=new String[15][15]; esto funciona bien y si uso String[][] t=new String[][]; porque tengo que declarar la variable t tan dinámica como no estoy seguro de cuánto valores voy a almacenar En t.declaración de matriz dinámica en java

Respuesta

8

Utilice ArrayList (u otro objeto de matriz que pueda manejar cualquier cantidad de objetos). Una matriz Java siempre tiene una longitud fija, ya que parte de la memoria se reservará para la matriz.

ArrayList crea dicha matriz también para almacenar los objetos. De usted agrega más objetos como el tamaño reservado actual de la matriz que ArrayList creará una nueva matriz más grande (+ 50% si estoy en lo cierto). Hay algunas otras implementaciones que actúan un poco diferente (por ejemplo, crean una nueva matriz 100% de la original cuando la matriz está llena. Si el rendimiento es realmente importante para usted que se puede mirar en esto.

ArrayList<ArrayList<String> t = new ArrayList<ArrayList<String>(); 

void fill() { 
    ArrayList<String> t2 = new ArrayList<String>(); 
    t2.add("somestring"); 
    String s = "someotherstring"; 
    t2.add(s); 
    t.add(t2); 
} 
+0

Una matriz Java siempre tiene una longitud FIJA, no un máximo. Algunas de las entradas pueden ser nulas. – DJClayworth

+0

su derecho, lo corrigió. –

+1

Si bien esto es posible, debe crear una ArrayList de (ArrayList of String), y 's = t [3] [12];' se convierte en 's = t.get (3) .get (12);' –

4

Si usted no sabe lo grande que tiene que ser sólo declarará como

String[][] t; 

y una vez que sabes lo grande que necesita ser que puede hacer (antes tratando de utilizar la matriz)

t = new String[15][15]; 

Si nunca está seguro de cuán grande debe ser el conjunto, deberá usar algo así como una Lista de listas.

List<List<String>> t = new ArrayList<List<String>>; 

public void add(String str, int row, int col) { 
    while (row >= t.size()) 
     t.add(new ArrayList<String>()); 

    List<String> row_list = t.get(row); 
    while (col >= row_list.size()) 
     row_list.add(""); 

    row_list.set(col, str); 
} 
+0

si uso 'String [] [] t = null; 'Obtengo un error que Exception in thread" main "java.lang.NullPointerException mientras lo usa' t [0] [0] = "ana" ' – raju

+0

@raju: aún necesita hacer' t = new String [sizeX ] [sizeY]; '* after * has descubierto cuáles son las dimensiones, pero * antes * de tu asignación' t [0] [0] = '. –

1

En Java los objetos de matriz son siempre de longitud fija. Una vez que los haya asignado, no podrá cambiar su tamaño. Se puede hacer una matriz variable para apuntar a diferentes objetos de matriz de diferentes tamaños. Por lo que puede asignar:

String[][] t; 

que no apuntar a un objeto y asignar un objeto más adelante una vez que se conoce el tamaño:

int n1,n2; 
// calculate n1,n2 
t = new String[n1][n2]; 

Si necesita una estructura en la que el tamaño puede cambiar usted está es mucho mejor usar ArrayList, que puede cambiar de tamaño dinámicamente.

0

un vector puede crecer demasiado:

Vector<Vector<String>> t = new Vector<Vector<String>>(); 

luego llamar al método Add para agregar elementos al vector.

+0

¿Por qué vector? Está innecesariamente sincronizado. – Ishtar

0

Como dijo bemace, solo porque esté declarando la variable no significa que deba inicializarla de inmediato.

Como dijo Mark, las matrices tienen un tamaño fijo. Una vez que una matriz es inicializada (no declarada, inicializada), tiene un tamaño fijo.

Por lo tanto, hay dos posibilidades:

O se va a saber el tamaño de la matriz tiene que ser antes de tener que comenzar a usarlo, en cuyo caso sólo tiene que retrasar su inicialización según lo sugerido por bemace.

O no sabrá qué tan grande debe ser antes de empezar a usarlo, en cuyo caso deberá usar una estructura de datos de tamaño dinámico.Echa un vistazo a la API de Java Colecciones:

tutorial api reference

1

declararemos como String [][]t = null;

Y Fecha con longitud real vez que lo consigue.

t=new String[x][y]; 
+0

mejor manera de usar el caso real. – Simmant

0

Hay varias buenas respuestas ya, pero ahora se ha puesto de manifiesto en un comentario a Mark Baijens' answer que el propósito de esta pregunta es que Raju necesita una llave para de valores múltiples mapeo.

Marca siguió ese comentario sugiriendo raju usar un HashMap<String, String> hashMap = new HashMap<String, String>(); — sin embargo, eso solo funciona para un solo par de clave-valor.

Lo que necesita es un Raju

Map<String, Collection<String>> t 
    = new HashMap<String, List<String>>(); 

Añadiendo el primer valor de una clave requiere la inicialización de una lista de ese cubo, al tiempo que añade valores adicionales requiere ir a buscar la lista existente y añadiendo el nuevo valor.

Nota Utilicé Collection<String> en la declaración, por lo que podría ser una lista si el orden de los valores es importante, o podría ser un conjunto para evitar valores duplicados con la misma clave.

Esto probablemente sería mejor implementado como una clase en sí, tal vez

public class MultiValueMap<K, V> extends Map<K, V> 
{ 
    ... 
} 

por lo que la inicialización de la lista de la primera put(key, value) y la posterior .add(value) a la lista podría estar oculto en la aplicación.

Cuestiones relacionadas