У меня есть следующий код:
String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");
Те два добавляют, не компилируют. Как это работало бы правильно?
Размер массива не может быть изменен. Если вам нужен массив большего размера, вам нужно создать новый.
Лучшим решением было бы использовать 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 );
Для массивов нет метода 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"
};
, но тогда это фиксированный размер и никакие элементы не могут быть добавлены.
Я не слишком разбираюсь в Java, но мне всегда говорили, что массивы - это статические структуры, которые имеют предопределенный размер. Вы должны использовать ArrayList, Vector или любую другую динамическую структуру.
Как сказано в тангенсе, размер массива фиксирован. Но сначала вы должны создать его экземпляр, иначе это будет только пустая ссылка.
String[] where = new String[10];
Этот массив может содержать только 10 элементов. Таким образом, вы можете добавить значение только 10 раз. В вашем коде вы обращаетесь к нулевой ссылке. Вот почему это не работает. Чтобы иметь динамически растущую коллекцию , используйте ArrayList.
Вам необходимо использовать список сбора. Вы не можете изменить размер массива.
Используйте список 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)
амортизированных затрат на операцию.