Kaip į masyvą pridėti naujų elementų?

Turiu tokį kodą:

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

Šie du priedai nesukompiliuojami. Kaip tai veiktų teisingai?

Sprendimas

Masyvo dydžio negalima keisti. Jei norite didesnio masyvo, turite sukurti naują masyvą.

Geresnis sprendimas būtų naudoti ArrayList, kuris gali didėti pagal poreikį. Metodas ArrayList.toArray( T[] a ) grąžina jums jūsų masyvą, jei jums reikia tokio pavidalo.

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

Jei reikia jį paversti paprastu masyvu...

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

Tačiau daugumą dalykų, kuriuos darote su masyvu, galite daryti ir su šiuo ArrayList:

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

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

Naudokite Sąrašas, pavyzdžiui, MasyvasSąrašas. Skirtingai nuo masyvų, jį galima dinamiškai didinti (žr.: 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]"

Jei primygtinai reikalaujate naudoti masyvus, galite naudoti java.util.Arrays.copyOf, kad paskirstytumėte didesnį masyvą papildomam elementui sutalpinti. Tačiau tai tikrai nėra geriausias sprendimas.

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

Tai yra O(N) vienam append. Kita vertus, ArrayList turi O(1) amortizuotų sąnaudų vienai operacijai.

Taip pat žr.

Komentarai (1)

Kaip sakė tangens, masyvo dydis yra fiksuotas. Tačiau pirmiausia turite jį instancuoti, kitaip jis bus tik nulinė nuoroda.

String[] where = new String[10];

Šiame masyve gali būti tik 10 elementų. Taigi reikšmę galite pridėti tik 10 kartų. Savo kode kreipiatės į nulinę nuorodą. Todėl tai neveikia. Norint turėti turėti dinamiškai didėjančią kolekciją, naudokite ArrayList.

Komentarai (0)