Есть ли более элегантный способ (желательно в SDK), который возьмет существующий массив из N String-объектов и добавит еще одну String, чтобы массив теперь имел N + 1 String-объекты? См. Ниже, как я это сделал.
import java.util.Arrays;
public class StringArrayAppend {
/**
* @param args
*/
public static void main(String[] args) {
String[] selectionArgs={"3","2"};
//Is there a SDK method to Arrays.append(selectionArgs,"1");?
int newSize=selectionArgs.length+1;
int indexNewElem=selectionArgs.length;
String[] selectionArgs2=new String[newSize];
System.arraycopy(selectionArgs, 0, selectionArgs2, 0, selectionArgs.length);
selectionArgs2[indexNewElem]="1";
selectionArgs=selectionArgs2;
selectionArgs2=null;
System.out.println("selectionArgs="+Arrays.toString(selectionArgs));
}
}
Вы можете сделать это в трех строках, но общая эффективность будет одинаковой:
String[] a = new String[] {"quick", "brown", "fox"};
List<String> s = new ArrayList<String>(Arrays.asList(a));
s.add("jumps");
a = s.toArray(new String[s.size()]);
System.out.println(Arrays.toString(a));
Тем не менее, лучший подход, когда вам нужна расширяемость вашего контейнера, - использовать ArrayList<String>
.
Если вы используете Java-массивы, я не знаю об элегантном способе добавления одного к другому, кроме как вы сделали (создайте другой массив с правильным размером и просто добавьте новые элементы в конец массива).
Изменение: я нашел однострочное решение, используя библиотеку Apache Commons Lang ArrayUtils.addAll(T [], T...)
String[] both = ArrayUtils.addAll(first, second);
Как насчет использования ArrayList? ArrayLists имеют динамический размер и позволят вам просто добавлять элементы (используя ArrayList.add(Object o)).
Я боюсь, ничего в JDK.
Вы можете использовать Commons Lang или просто сделать вспомогательный метод (например, тот, что в вашем текущем коде).
Вы можете немного упростить код, используя Arrays#copyOf
(который позволяет копировать один элемент дольше, чем оригинал).
Независимо от того, как вы это сделаете, вы получите новый массив. Поскольку массивы не могут быть изменены, другого пути нет.
Насколько я знаю, если не преобразовать ваш массив в/из списка, в JDK ничего нет, чтобы упростить эту операцию. Если вы не против потянуть в библиотеке Google Guava, вы можете использовать его ObjectArrays.concat()
.
Используя значения из вашего примера кода, он будет выглядеть так:
String[] selectionArgs = {"3", "2"};
selectionArgs = ObjectArrays.concat(selectionArgs, "1");