У меня есть следующий код:
String[] where;
where.append(ContactsContract.Contacts.HAS_PHONE_NUMBER + "=1");
where.append(ContactsContract.Contacts.IN_VISIBLE_GROUP + "=1");
Эти два добавления не компилируются. Как это будет работать правильно?
У меня есть следующий код:
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 );
Используйте List<String>
, например ArrayList<String>
. Он динамически растет, в отличие от массивов (см.: Эффективное Java 2nd Edition, пункт 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)
за append
. ArrayList
, с другой стороны, имеет O(1)
амортизированную стоимость за операцию.
Apache Commons Lang имеет
T[] t = ArrayUtils.add( initialArray, newitem );
он возвращает новый массив, но если вы действительно работаете с массивами по какой-то причине, это может быть идеальным способом сделать это.
Есть еще один вариант, который я не видел здесь и который не включает "сложные" объекты или коллекции.
String[] array1 = new String[]{"one", "two"};
String[] array2 = new String[]{"three"};
String[] array = new String[array1.length + array2.length];
System.arraycopy(array1, 0, array, 0, array1.length);
System.arraycopy(array2, 0, array, array1.length, array2.length);
В массивах нет метода 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"
};
но тогда это фиксированный размер, и никакие элементы не могут быть добавлены.
Как говорят тангенсы, размер массива фиксирован. Но сначала вы должны создать экземпляр, иначе это будет только нулевая ссылка.
String[] where = new String[10];
Этот массив может содержать только 10 элементов. Таким образом, вы можете добавить значение всего 10 раз. В вашем коде вы получаете нулевую ссылку. Вот почему это не работает. Чтобы иметь динамически растущей коллекции, используйте ArrayList.
String[] source = new String[] { "a", "b", "c", "d" };
String[] destination = new String[source.length + 2];
destination[0] = "/bin/sh";
destination[1] = "-c";
System.arraycopy(source, 0, destination, 2, source.length);
for (String parts : destination) {
System.out.println(parts);
}
Вам нужно использовать список коллекций. Вы не можете изменять размер массива.
Если вы хотите сохранить свои данные в простом массиве, например
String[] where = new String[10];
и вы хотите добавить к нему некоторые элементы, как номера, пожалуйста, StringBuilder, который намного эффективнее, чем конкатенация строки.
StringBuilder phoneNumber = new StringBuilder();
phoneNumber.append("1");
phoneNumber.append("2");
where[0] = phoneNumber.toString();
Это намного лучший способ построить вашу строку и сохранить ее в вашем массиве "where".
Добавление новых элементов в массив String.
String[] myArray = new String[] {"x", "y"};
// Convert array to list
List<String> listFromArray = Arrays.asList(myArray);
// Create new list, because, List to Array always returns a fixed-size list backed by the specified array.
List<String> tempList = new ArrayList<String>(listFromArray);
tempList.add("z");
//Convert list back to array
String[] tempArray = new String[tempList.size()];
myArray = tempList.toArray(tempArray);
Я сделал этот код! Он работает как шарм!
public String[] AddToStringArray(String[] oldArray, String newString)
{
String[] newArray = Arrays.copyOf(oldArray, oldArray.length+1);
newArray[oldArray.length] = newString;
return newArray;
}
Надеюсь, вам понравится!
Есть много способов добавить элемент в массив. Вы можете использовать временный List
для управления элементом и затем преобразовать его обратно в Array
, или вы можете использовать java.util.Arrays.copyOf
и комбинировать его с обобщениями для лучших результатов.
Этот пример покажет вам, как:
public static <T> T[] append2Array(T[] elements, T element)
{
T[] newArray = Arrays.copyOf(elements, elements.length + 1);
newArray[elements.length] = element;
return newArray;
}
Чтобы использовать этот метод, вам просто нужно вызвать его так:
String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, "four");
System.out.println(Arrays.toString(numbers));
Если вы хотите объединить два массива, вы можете изменить предыдущий метод следующим образом:
public static <T> T[] append2Array(T[] elements, T[] newElements)
{
T[] newArray = Arrays.copyOf(elements, elements.length + newElements.length);
System.arraycopy(newElements, 0, newArray, elements.length, newElements.length);
return newArray;
}
Теперь вы можете вызывать метод следующим образом:
String[] numbers = new String[]{"one", "two", "three"};
String[] moreNumbers = new String[]{"four", "five", "six"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(numbers, moreNumbers);
System.out.println(Arrays.toString(numbers));
Как я уже упоминал, вы также можете использовать объекты List
. Тем не менее, для его безопасного применения потребуется небольшой взлом:
public static <T> T[] append2Array(Class<T[]> clazz, List<T> elements, T element)
{
elements.add(element);
return clazz.cast(elements.toArray());
}
Теперь вы можете вызывать метод следующим образом:
String[] numbers = new String[]{"one", "two", "three"};
System.out.println(Arrays.toString(numbers));
numbers = append2Array(String[].class, Arrays.asList(numbers), "four");
System.out.println(Arrays.toString(numbers));
Я не настолько разбираюсь в Java, но мне всегда говорили, что массивы - это статические структуры, которые имеют предопределенный размер. Вы должны использовать ArrayList или Vector или любую другую динамическую структуру.
вы можете создать arraylist и использовать Collection.addAll()
для преобразования массива строк в ваш arraylist
Вы можете просто сделать это:
System.arraycopy(initialArray, 0, newArray, 0, initialArray.length);
Если вы действительно хотите изменить размер массива, вы можете сделать что-то вроде этого:
String[] arr = {"a", "b", "c"};
System.out.println(Arrays.toString(arr));
// Output is: [a, b, c]
arr = Arrays.copyOf(arr, 10); // new size will be 10 elements
arr[3] = "d";
arr[4] = "e";
arr[5] = "f";
System.out.println(Arrays.toString(arr));
// Output is: [a, b, c, d, e, f, null, null, null, null]
Размер массива не может быть изменен. Если вам нужно использовать массив, вы можете использовать:
System.arraycopy(src, srcpos, dest, destpos, length);