Добавить строку в собственный массив Java

1

Есть ли более элегантный способ (желательно в 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
arrays
append
native

4 ответа

1
Лучший ответ

Вы можете сделать это в трех строках, но общая эффективность будет одинаковой:

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));

Demo.

Тем не менее, лучший подход, когда вам нужна расширяемость вашего контейнера, - использовать ArrayList<String>.

  • 0
    Ах, это то, что я искал. Я пробовал это с asList (...) раньше, но не мог понять, как справиться с ошибками приведения. Спасибо!
  • 0
    Но обратите внимание, что на самом деле это делает три копии вашего массива (тогда как у кода OP была только одна): в конструкторе ArrayList, вторая при добавлении (потому что емкость должна быть расширена) и третья при вызове toArray.
1

Если вы используете Java-массивы, я не знаю об элегантном способе добавления одного к другому, кроме как вы сделали (создайте другой массив с правильным размером и просто добавьте новые элементы в конец массива).

Изменение: я нашел однострочное решение, используя библиотеку Apache Commons Lang ArrayUtils.addAll(T [], T...)

String[] both = ArrayUtils.addAll(first, second);

Как насчет использования ArrayList? ArrayLists имеют динамический размер и позволят вам просто добавлять элементы (используя ArrayList.add(Object o)).

1

Я боюсь, ничего в JDK.

Вы можете использовать Commons Lang или просто сделать вспомогательный метод (например, тот, что в вашем текущем коде).

Вы можете немного упростить код, используя Arrays#copyOf (который позволяет копировать один элемент дольше, чем оригинал).

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

  • 0
    Спасибо за ваш вклад. Не знал, что copyOf существует.
0

Насколько я знаю, если не преобразовать ваш массив в/из списка, в JDK ничего нет, чтобы упростить эту операцию. Если вы не против потянуть в библиотеке Google Guava, вы можете использовать его ObjectArrays.concat().

Используя значения из вашего примера кода, он будет выглядеть так:

String[] selectionArgs = {"3", "2"};
selectionArgs = ObjectArrays.concat(selectionArgs, "1");

Ещё вопросы

Сообщество Overcoder
Наверх
Меню