Como adicionar novos elementos a uma matriz?

Eu tenho o seguinte código:

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

Esses dois apêndices não estão a compilar. Como é que isso funcionaria correctamente?

Solução

O tamanho de um array pode't ser modificado. Se você quer um array maior, você tem que instanciar um novo.

Uma solução melhor seria utilizar uma ArrayList que pode crescer conforme você precisar. O método ArrayList.toArray( T[] a ) devolve o seu array se você precisar dele nesta forma.

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

Se precisar de o converter para uma simples matriz...

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

Mas a maioria das coisas que você faz com um array você pode fazer com esta ArrayList, também:

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

// get specific items
where.get( 1 );
Comentários (3)

Utilize uma List, como uma ArrayList. It's cresce dinamicamente, ao contrário de arrays (veja: Effective Java 2nd Edition, Item 25: Preferir listas a 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]"

Se você insiste em utilizar arrays, você pode utilizar java.util.Arrays.copyOf para alocar um array maior para acomodar o elemento adicional. Esta não é realmente a melhor solução, no entanto.

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]"

Este é o "O(N)O(N)por append'. Já aArrayList', tem O(1) custo amortizado por operação.

Ver também

Comentários (1)

Como tangens disse, o tamanho de uma matriz é fixo. Mas você tem que instanciá-lo primeiro, senão ele será apenas uma referência nula.

String[] where = new String[10];

Esta matriz pode conter apenas 10 elementos. Então você pode anexar um valor apenas 10 vezes. Em seu código você're acessando uma referência nula. Esse'é o porquê de não funcionar. A fim de ter um Coleção de crescimento dinâmico, use a ArrayList.

Comentários (0)