Wie fügt man neue Elemente zu einem Array hinzu?

Ich habe den folgenden Code:

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

Diese beiden Anhänge werden nicht kompiliert. Wie würde das korrekt funktionieren?

Lösung

Die Größe eines Arrays kann nicht geändert werden. Wenn Sie ein größeres Array wünschen, müssen Sie ein neues Array erstellen.

Eine bessere Lösung wäre die Verwendung einer ArrayList, die je nach Bedarf erweitert werden kann. Die Methode ArrayList.toArray( T[] a ) gibt Ihnen Ihr Array zurück, wenn Sie es in dieser Form benötigen.

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

Wenn Sie es in ein einfaches Array umwandeln müssen...

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

Aber die meisten Dinge, die man mit einem Array machen kann, kann man auch mit dieser ArrayList machen:

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

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

Verwenden Sie eine List, wie z.B. eine ArrayList. Sie ist im Gegensatz zu Arrays dynamisch erweiterbar (siehe: Effective Java 2nd Edition, Punkt 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]"

Wenn Sie darauf bestehen, Arrays zu verwenden, können Sie java.util.Arrays.copyOf verwenden, um ein größeres Array zuzuweisen, um das zusätzliche Element unterzubringen. Dies ist allerdings nicht die beste Lösung.

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

Das ist O(N) pro append. ArrayList" hingegen hat O(1) amortisierte Kosten pro Operation.

Siehe auch

Kommentare (1)

Wie tangens sagte, ist die Größe eines Arrays fest. Aber Sie müssen es zuerst instanziieren, sonst wird es nur eine Null-Referenz sein.

String[] where = new String[10];

Dieses Array kann nur 10 Elemente enthalten. Sie können also nur 10 Mal einen Wert anhängen. In Ihrem Code greifen Sie auf eine Null-Referenz zu. Deshalb funktioniert es nicht. Um eine dynamisch wachsende Sammlung zu haben, verwenden Sie die ArrayList.

Kommentare (0)