¿Cómo añadir nuevos elementos a un array?

Tengo el siguiente código:

String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");

Esos dos apéndices no están compilando. ¿Cómo podría funcionar correctamente?

Solución

El tamaño de un array no se puede modificar. Si quieres un array más grande tienes que instanciar uno nuevo.

Una mejor solución sería usar un ArrayList que puede crecer según lo necesites. El método ArrayList.toArray( T[] a ) te devuelve tu array si lo necesitas de esta forma.

List where = new ArrayList();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );

Si necesitas convertirlo en un simple array...

String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );

Pero la mayoría de las cosas que haces con un array las puedes hacer también con este ArrayList:

// iterate over the array
for( String oneItem : where ) {
    ...
}

// get specific items
where.get( 1 );
Comentarios (3)

Utilice una List, como un ArrayList. Es dinámicamente creíble, a diferencia de los arrays (ver: Java Efectivo 2ª Edición, Punto 25: Prefiera las listas a los arrays).

import java.util.*;
//....

List list = new ArrayList();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"

Si insiste en utilizar arrays, puede utilizar java.util.Arrays.copyOf para asignar un array más grande para acomodar el elemento adicional. Sin embargo, esta no es la mejor solución.

static  T[] append(T[] arr, T element) {
    final int N = arr.length;
    arr = Arrays.copyOf(arr, N + 1);
    arr[N] = element;
    return arr;
}

String[] arr = { "1", "2", "3" };
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3]"
arr = append(arr, "4");
System.out.println(Arrays.toString(arr)); // prints "[1, 2, 3, 4]"

Esto es O(N) por append. Por otro lado, ArrayList tiene un coste amortizado de O(1) por operación.

Ver también

Comentarios (1)

Como dijo tangens, el tamaño de un array es fijo. Pero hay que instanciarlo primero, si no será sólo una referencia nula.

String[] where = new String[10];

Esta matriz puede contener sólo 10 elementos. Así que usted puede agregar un valor sólo 10 veces. En tu código estás accediendo a una referencia nula. Por eso no funciona. Para tener una colección que crezca dinámicamente, usa el ArrayList.

Comentarios (0)