Как объединить два массива в один java
Перейти к содержимому

Как объединить два массива в один java

Как я могу объединить два массива в Java?

Вот простой метод, который объединит два массива и вернет результат:

Обратите внимание, что он не будет работать с примитивными типами данных, только с типами объектов.

Следующая несколько более сложная версия работает как с объектными, так и с примитивными массивами. Он делает это, используя T вместо T[] в качестве типа аргумента.

Он также позволяет объединять массивы двух разных типов, выбирая наиболее общий тип в качестве типа компонента результата.

Ответ 3

Можно написать полностью общую версию, которая может быть даже расширена, чтобы объединить любое количество массивов. Для этих версий требуется Java 6, поскольку они используют Arrays.copyOf()

Обе версии избегают создания каких-либо промежуточных объектов List и используют System.arraycopy() , чтобы обеспечить максимально быстрое копирование больших массивов.

Для двух массивов это выглядит так:

А для произвольного количества массивов ( >= 1) это выглядит так:

Ответ 4

Использование Stream в Java 8:

Ответ 5

Кроме того, существуют версии для примитивных массивов:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)
Ответ 6

Использование Java API:

Ответ 7

Вы можете добавить два массива в две строки кода.

Это быстрое и эффективное решение, которое будет работать для примитивных типов, так как оба метода перегружены.

Вам следует избегать решений, включающих ArrayLists, потоки и т.д., Так как они должны будут выделять временную память без какой-либо полезной цели.

Вы должны избегать for петель для больших массивов, поскольку они не являются эффективными. Встроенные методы используют функции блочного копирования, которые чрезвычайно быстры.

Ответ 8

Решение 100% старой java и без System.arraycopy (например, недоступно в клиенте GWT):

Ответ 9

Я недавно боролся с проблемами с чрезмерным вращением памяти. Если известно, что a и/или b обычно пусты, вот еще одна адаптация кода silvertab (также генерируется):

Редактировать: в предыдущей версии этого поста говорилось, что повторное использование массива должно быть четко задокументировано. Как указывает Мартен в комментариях, в целом было бы лучше просто удалить операторы if, что исключает необходимость иметь документацию. Но опять же, эти операторы if были главной целью этой конкретной оптимизации. Я оставлю этот ответ здесь, но будьте осторожны!

Ответ 10

Функциональная библиотека Java имеет класс оболочки-массива, который оснащает массивы удобными методами, такими как конкатенация.

Чтобы вернуть освобожденный массив, вызовите

Ответ 11
Ответ 12

Здесь адаптация решения silvertab с модифицированными дженериками:

ПРИМЕЧАНИЕ. См. Ответ Joachim для решения Java 6. Это не только устраняет предупреждение; он также короче, эффективнее и легче читать!

Ответ 13

Другой способ использования Java8 с помощью Stream

Ответ 14

Если вы используете этот способ, вам не нужно импортировать какой-либо сторонний класс.

Если вы хотите объединить String

Пример кода для concate двух String Array

Если вы хотите объединить Int

Пример кода для concate двух целых массивов

Вот основной метод

Мы также можем использовать этот способ.

Ответ 15

Пожалуйста, простите меня за добавление еще одной версии в этот уже длинный список. Я посмотрел на каждый ответ и решил, что мне действительно нужна версия с одним параметром в подписи. Я также добавил некоторые аргументы, чтобы извлечь выгоду из раннего отказа с разумной информацией в случае неожиданного ввода.

Ответ 16

Вы можете попробовать преобразовать его в Arraylist и использовать метод addAll, а затем преобразовать обратно в массив.

Ответ 17

Здесь возможная реализация в рабочем коде решения псевдокода, написанного silvertab.

Далее следуют интерфейс построителя.

Примечание. Строитель необходим, поскольку в java невозможно выполнить

из-за стирания родового типа:

Здесь конкретный строитель, реализующий интерфейс, построив массив Integer :

И, наконец, приложение /test:

Ответ 18

Используя потоки Java 8+, вы можете написать следующую функцию:

Ответ 19

Это работает, но вам нужно вставить свою собственную проверку ошибок.

Он, вероятно, не самый эффективный, но он не полагается ни на что иное, кроме Java собственного API.

Ответ 20

Ничего себе! множество сложных ответов здесь, включая некоторые простые, которые зависят от внешних зависимостей. как сделать это следующим образом:

Ответ 21

Это преобразованная функция для массива String:

Ответ 22

Как насчет просто

И просто сделайте Array.concat(arr1, arr2) . Пока arr1 и arr2 имеют один и тот же тип, это даст вам другой массив того же типа, содержащий оба массива.

Ответ 23

Это должно быть однострочным.

Ответ 24

Простая вариация, позволяющая объединить несколько массивов:

Ответ 25

Вот моя немного улучшенная версия Joachim Sauer concatAll. Он может работать на Java 5 или 6, используя Java 6 System.arraycopy, если он доступен во время выполнения. Этот метод (IMHO) идеально подходит для Android, поскольку он работает на Android < 9 (который не имеет System.arraycopy), но будет использовать более быстрый метод, если это возможно.

Ответ 26

Еще один способ задуматься над вопросом. Чтобы объединить два или более массивов, нужно сделать это, чтобы перечислить все элементы каждого массива, а затем построить новый массив. Это похоже на создание List<T> , а затем называет toArray . В некоторых других ответах используется ArrayList , и это прекрасно. Но как насчет внедрения наших собственных? Это не сложно:

Я считаю, что приведенное выше эквивалентно решениям, использующим System.arraycopy . Однако я думаю, что у этого есть своя красота.

Ответ 27
Ответ 28

Использование только собственного API Javas:

Теперь этот код не самый эффективный, но он опирается только на стандартные классы Java и легко понять. Он работает для любого числа String [] (даже нулевые массивы).

Ответ 29

Простой, но неэффективный способ сделать это (generics не включены):

Ответ 30

Независимость от типа (ОБНОВЛЕНО — благодаря Volley для создания экземпляра T):

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

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

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

How can I concatenate two arrays in Java?

Here’s a simple method that will concatenate two arrays and return the result:

Note that it will not work with primitive data types, only with object types.

The following slightly more complicated version works with both object and primitive arrays. It does this by using T instead of T[] as the argument type.

It also makes it possible to concatenate arrays of two different types by picking the most general type as the component type of the result.

Here is an example:

Using Stream in Java 8:

Or like this, using flatMap :

To do this for a generic type you have to use reflection:

It’s possible to write a fully generic version that can even be extended to concatenate any number of arrays. This versions require Java 6, as they use Arrays.copyOf()

Both versions avoid creating any intermediary List objects and use System.arraycopy() to ensure that copying large arrays is as fast as possible.

For two arrays it looks like this:

And for a arbitrary number of arrays (>= 1) it looks like this:

Or with the beloved Guava:

Also, there are versions for primitive arrays:

  • Booleans.concat(first, second)
  • Bytes.concat(first, second)
  • Chars.concat(first, second)
  • Doubles.concat(first, second)
  • Shorts.concat(first, second)
  • Ints.concat(first, second)
  • Longs.concat(first, second)
  • Floats.concat(first, second)

You can append the two arrays in two lines of code.

This is a fast and efficient solution and will work for primitive types as well as the two methods involved are overloaded.

You should avoid solutions involving ArrayLists, streams, etc as these will need to allocate temporary memory for no useful purpose.

You should avoid for loops for large arrays as these are not efficient. The built in methods use block-copy functions that are extremely fast.

Using the Java API:

A solution 100% old java and without System.arraycopy (not available in GWT client for example):

I’ve recently fought problems with excessive memory rotation. If a and/or b are known to be commonly empty, here is another adaption of silvertab’s code (generified too):

Edit: A previous version of this post stated that array re-usage like this shall be clearly documented. As Maarten points out in the comments it would in general be better to just remove the if statements, thus voiding the need for having documentation. But then again, those if statements were the whole point of this particular optimization in the first place. I’ll leave this answer here, but be wary!

The Functional Java library has an array wrapper class that equips arrays with handy methods like concatenation.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *