Как да добавяме нови елементи в масив?

Имам следния код:

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

Тези две добавки не се компилират. Как това би работило правилно?

Решение

Размерът на масива не може да се променя. Ако искате по-голям масив, трябва да създадете нов.

По-доброто решение би било да използвате ArrayList, който може да нараства според нуждите ви. Методът ArrayList.toArray( T[] a ) ви връща вашия масив, ако ви е необходим в този вид.

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

Ако трябва да го превърнете в обикновен масив...

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

Но повечето неща, които правите с масив, можете да правите и с този ArrayList:

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

// get specific items
where.get( 1 );
Коментари (3)

Използвайте List, например ArrayList. За разлика от масивите, той може да се увеличава динамично (вижте: 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]"

Ако настоявате да използвате масиви, можете да използвате java.util.Arrays.copyOf, за да заделите по-голям масив, който да побере допълнителния елемент. Това обаче наистина не е най-доброто решение.

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

Това е O(N) за всяко прилагане. От друга страна, ArrayList има O(1) амортизирани разходи за операция.

Вижте също

  • Java Tutorials/Arrays
    • Масивът е контейнерен обект, който съдържа фиксиран брой стойности от един тип. Дължината на масива се определя при създаването му. След създаването му дължината му е фиксирана.
  • Java Tutorials/The List interface
Коментари (1)

Както каза tangens, размерът на масива е фиксиран. Но първо трябва да го инстанцирате, защото в противен случай той ще бъде само нулева референция.

String[] where = new String[10];

Този масив може да съдържа само 10 елемента. Така че можете да добавите стойност само 10 пъти. Във вашия код получавате достъп до нулева референция. Ето защо не работи. За да имате динамично нарастваща колекция, използвайте ArrayList.

Коментари (0)