Ako pridať nové prvky do poľa?

Mám nasledujúci kód:

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

Tieto dva prídavky sa neskompilujú. Ako by to malo správne fungovať?

Riešenie

Veľkosť poľa nie je možné meniť. Ak chcete väčšie pole, musíte vytvoriť nové.

Lepším riešením by bolo použiť ArrayList, ktoré sa môže zväčšovať podľa potreby. Metóda ArrayList.toArray( T[] a ) vám vráti vaše pole, ak ho potrebujete v tejto podobe.

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

Ak ho potrebujete previesť na jednoduché pole...

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

Ale väčšinu vecí, ktoré robíte s poľom, môžete robiť aj s týmto ArrayListom:

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

// get specific items
where.get( 1 );
Komentáre (3)

Použite List, napríklad ArrayList. Na rozdiel od polí ho možno dynamicky zväčšovať (pozri: Effective Java 2nd Edition, Item 25: Prefer lists to 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]"

Ak trváte na použití polí, môžete použiť java.util.Arrays.copyOf na alokáciu väčšieho poľa, ktoré pojme ďalší prvok. Toto však naozaj nie je najlepšie riešenie.

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

Toto je O(N) na append. Na druhej strane, ArrayListO(1) amortizovaných nákladov na jednu operáciu.

Pozri tiež

Komentáre (1)

Ako povedal tangens, veľkosť poľa je pevne daná. Musíte ho však najprv inštanciovať, inak to bude len nulová referencia.

String[] where = new String[10];

Toto pole môže obsahovať iba 10 prvkov. Takže hodnotu môžete pridať len 10-krát. Vo vašom kóde pristupujete k nulovej referencii. Preto to nefunguje. Aby ste mali dynamicky rastúcu kolekciu, použite ArrayList.

Komentáre (0)