Ho il seguente codice:
String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");
Queste due appendici non si compilano. Come potrebbe funzionare correttamente?
La dimensione di un array non può essere modificata. Se volete un array più grande, dovete istanziarne uno nuovo.
Una soluzione migliore sarebbe quella di usare una ArrayList
che può crescere a seconda delle necessità. Il metodo ArrayList.toArray( T[] a )
vi restituisce il vostro array se ne avete bisogno in questa forma.
List<String> where = new ArrayList<String>();
where.add( ContactsContract.Contacts.HAS_PHONE_NUMBER+"=1" );
where.add( ContactsContract.Contacts.IN_VISIBLE_GROUP+"=1" );
Se avete bisogno di convertirlo in un semplice array...
String[] simpleArray = new String[ where.size() ];
where.toArray( simpleArray );
Ma la maggior parte delle cose che si fanno con un array si possono fare anche con questa ArrayList:
// iterate over the array
for( String oneItem : where ) {
...
}
// get specific items
where.get( 1 );
Usate una List<String>
, come una ArrayList<String>
. E' dinamicamente coltivabile, a differenza degli array (vedi: Effective Java 2nd Edition, Item 25: Preferisci le liste agli array).
import java.util.*;
//....
List<String> list = new ArrayList<String>();
list.add("1");
list.add("2");
list.add("3");
System.out.println(list); // prints "[1, 2, 3]"
Se insistete nell'usare gli array, potete usare java.util.Arrays.copyOf
per allocare un array più grande per ospitare l'elemento aggiuntivo. Questa non è proprio la soluzione migliore, però.
static <T> 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]"
Questo è O(N)
per append
. ArrayList
, d'altra parte, ha O(1)
costo ammortizzato per operazione.
Come ha detto tangens, la dimensione di un array è fissa. Ma dovete istanziarlo prima, altrimenti sarà solo un riferimento nullo.
String[] where = new String[10];
Questo array può contenere solo 10 elementi. Quindi puoi aggiungere un valore solo 10 volte. Nel tuo codice stai accedendo ad un riferimento nullo. Ecco perché non funziona. Per avere una collezione che cresce dinamicamente, usa la ArrayList.