Александр Горбач


программирование, админство

Варианты объединения двух массивов в Java

без комментариев

В любом языке с долгой историей появляется то-ли фича то ли бага делать одну, вроде бы простую вещь можно несколькими способами. Возьмем тривиальную задачу: объединить два массива одного типа в один в java. И тут оказывается есть три способа как это сделать с разной степенью абстракции и со своими плюсами и минусами. Рассмотрим их.

Первый и самый короткий — это использовать старую добрую библиотечку Apache Commons Lang. И метод public static T[] addAll(T[] array1,T… array2).
Пример использования:

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

Но этот путь чреват зависимостями. После опыта разработки на android устройства я аккуратно стал относиться к зависимостям и стараюсь не использовать целую библиотеку ради одной функции. Но java очень мощный язык и мы можем написать свою функцию (метод) для объединения двух массивов в один в независимости от типа данных:

public <T> T[] concatenate (T[] A, T[] B) {
    int aLen = A.length;
    int bLen = B.length;

    @SuppressWarnings("unchecked")
    T[] C = (T[]) Array.newInstance(A.getClass().getComponentType(), aLen+bLen);
    System.arraycopy(A, 0, C, 0, aLen);
    System.arraycopy(B, 0, C, aLen, bLen);

    return C;
}

Следует обратить внимание, что массивы могут быть только с элементами, тип которых — потомок от типа Object. Впрочем, зачастую так и бывает. Можно расслабиться.
Если же все-таки случилось страшное, или же мы используем старый JDK, без поддержки произвольной типизации функций, то всегда можно переписать без дженериков:

Foo[] concat(Foo[] A, Foo[] B) {
  int aLen = A.length;
  int bLen = B.length;
  Foo[] C= new Foo[aLen+bLen];
  System.arraycopy(A, 0, C, 0, aLen);
  System.arraycopy(B, 0, C, aLen, bLen);
  return C;
}

Автор Sash(k)a

Апрель 12th, 2014 at 6:38 пп

Опубликовано в Без рубрики

Тэги ,

Оставьте комментарий

Яндекс.Метрика