Как добавить новые элементы к массиву?

У меня есть следующий код:

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

Те два добавляют, не компилируют. Как это работало бы правильно?

271
задан Paul Bellora 12 February 2013 в 18:11
поделиться

6 ответов

Размер массива не может быть изменен. Если вам нужен массив большего размера, вам нужно создать новый.

Лучшим решением было бы использовать ArrayList , который может увеличиваться по мере необходимости. Метод ArrayList.toArray (T [] a) возвращает ваш массив, если он вам нужен в этой форме.

List<String> where = new ArrayList<String>();
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 );
376
ответ дан 23 November 2019 в 02:16
поделиться

Для массивов нет метода append () . Вместо этого, как уже было предложено, объект List может обслуживать необходимость динамической вставки элементов, например.

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

Или, если вы действительно хотите использовать массив:

String[] where = new String[]{
    ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1",
    ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1"
};

, но тогда это фиксированный размер и никакие элементы не могут быть добавлены.

14
ответ дан 23 November 2019 в 02:16
поделиться

Я не слишком разбираюсь в Java, но мне всегда говорили, что массивы - это статические структуры, которые имеют предопределенный размер. Вы должны использовать ArrayList, Vector или любую другую динамическую структуру.

3
ответ дан 23 November 2019 в 02:16
поделиться

Как сказано в тангенсе, размер массива фиксирован. Но сначала вы должны создать его экземпляр, иначе это будет только пустая ссылка.

String[] where = new String[10];

Этот массив может содержать только 10 элементов. Таким образом, вы можете добавить значение только 10 раз. В вашем коде вы обращаетесь к нулевой ссылке. Вот почему это не работает. Чтобы иметь динамически растущую коллекцию , используйте ArrayList.

7
ответ дан 23 November 2019 в 02:16
поделиться

Вам необходимо использовать список сбора. Вы не можете изменить размер массива.

5
ответ дан 23 November 2019 в 02:16
поделиться

Используйте список List , например ArrayList . Он динамически расширяется, в отличие от массивов (см .: Эффективное Java 2-е издание, Правило 25: Предпочитайте списки массивам ).

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

Если вы настаиваете на использовании массивов, вы можете использовать java.util.Arrays.copyOf , чтобы выделить больший массив для размещения дополнительного элемента. Однако это действительно не лучшее решение.

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

Это O (N) на добавление . ArrayList , с другой стороны, имеет O (1) амортизированных затрат на операцию.

См. Также

94
ответ дан 23 November 2019 в 02:16
поделиться
Другие вопросы по тегам:

Похожие вопросы: