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

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

  • автор:

4.7. Java примеры – Как объединить два массива в один

В этом примере показано, как объединить два массива в один массив с помощью метода list.Addall(array1.asList(array2) класса List и метода Arrays.toString() класса Array.

import java.util.ArrayList; import java.util.Arrays; import java.util.List; public class Main < public static void main(String args[]) < String a[] = < "А", "Б", "В" >; String b[] = < "Г", "Д" >; List list = new ArrayList(Arrays.asList(a)); list.addAll(Arrays.asList(b)); Object[] c = list.toArray(); System.out.println(Arrays.toString(c)); > > 

Результат

Вышеприведенный пример кода даст следующий результат:

[А, Б, В, Г, Д] 

Еще один пример соединения массивов в Java.

public class HelloWorld < public static void main(String[] args) < int[]a = ; int[]b = ; int[]c = new int[a.length+b.length]; int count = 0; for(int i = 0; i < a.length; i++) < c[i] = a[i]; count++; >for(int j = 0; j < b.length;j++) < c[count++] = b[j]; >for(int i = 0;i < c.length;i++) System.out.print(c[i]+" "); >> 

Вышеприведенный пример кода даст следующий результат:

1,2,3,4,4,16,1,2,3,22 

Оглавление

  • 1. Java примеры – Использование кода на практике
  • 2. Java примеры – Окружающая среда
  • 2.1. Java примеры – Скомпилировать файл
  • 2.2. Java примеры – Установить путь к нескольким классам
  • 2.3. Java примеры – Отладка java-файла
  • 2.4. Java примеры – Установить путь к классу
  • 2.5. Java примеры – Просмотреть текущий путь класса
  • 2.6. Java примеры – Установить назначение файла класса
  • 2.7. Java примеры – Запустить скомпилированный java-файл класса
  • 2.8. Java примеры – Узнать версию Java
  • 2.9. Java примеры – Установить путь к классу в .jar-файле или .zip-файле
  • 3. Java примеры – Строки
  • 3.1. Java примеры – Сравнить две строки
  • 3.2. Java примеры – Найти последнее вхождение подстроки внутри подстроки
  • 3.3. Java примеры – Удалить нужный символ из строки
  • 3.4. Java примеры – Заменить символ в строке
  • 3.5. Java примеры – Вывод в обратном порядке
  • 3.6. Java примеры – Нахождение символа или слова в строке
  • 3.7. Java примеры – Разбиение строки на слова и символы
  • 3.8. Java примеры – Преобразование строки в верхний регистр
  • 3.9. Java примеры – Найти слово в строке
  • 3.10. Java примеры – Сравнить производительность создания строки
  • 3.11. Java примеры – Оптимизировать создание строк
  • 3.12. Java примеры – Форматирование строк
  • 3.13. Java примеры – Конкатенация строк
  • 3.14. Java примеры – Определить код Юникода символа в строке
  • 3.15. Java примеры – Буферизация строк
  • 4. Java примеры – Массивы
  • 4.1. Java примеры – Сортировка массива и поиск элемента
  • 4.2. Java примеры – Метод сортировки массива, вставить элемент в массив
  • 4.3. Java примеры – Размер двумерного массива
  • 4.4. Java примеры – Обратный порядок массива, переворачиваем массив
  • 4.5. Java примеры – Как выводить массивы и двумерные массивы в консоль
  • 4.6. Java примеры – Найти максимальный и минимальный элемент массива
  • 4.7. Java примеры – Соединить два массива в один
  • 4.8. Java примеры – Как заполнить массив числами
  • 4.9. Java примеры – Увеличить массив после инициализации
  • 4.10. Java примеры – Сравнение двух массивов
  • 4.11. Java примеры – Удаление элемента из массива
  • 4.12. Java примеры – Удаление массива из другого массива
  • 4.13. Java примеры – Одинаковые элементы массивов
  • 4.14. Java примеры – Поиск в массиве
  • 4.15. Java примеры – Равенство двух массивов
  • 4.16. Java примеры – Сравнить массивы
  • 5. Java примеры – Дата и время
  • 5.1. Java примеры – Форматирование времени в формате AM-PM
  • 5.2. Java примеры – Получение названия и номера текущего месяца
  • 5.3. Java примеры – Получить текущее время в часах и минутах
  • 5.4. Java примеры – Вывести текущее время и дату
  • 5.5. Java примеры – Вывести текущее время в 24-часовом формате
  • 5.6. Java примеры – Получить текущий месяц
  • 5.7. Java примеры – Получить текущие секунды
  • 5.8. Java примеры – Получить короткое название месяца
  • 5.9. Java примеры – Получить день недели
  • 5.10. Java примеры – Добавление времени к дате
  • 5.11. Java примеры – Отображение времени в формате другой страны
  • 5.12. Java примеры – Отображение времени на разных языках
  • 5.13. Java примеры – Прокрутить часы и месяцы
  • 5.14. Java примеры – Получить номер недели и месяц в году
  • 5.15. Java примеры – Форматы текущей даты
  • 6. Java примеры – Методы
  • 6.1. Java примеры – Перезагрузка методов
  • 6.2. Java примеры – Вывод массива с использованием метода
  • 6.3. Java примеры – Решение Ханойской башни
  • 6.4. Java примеры – Последовательность чисел Фибоначчи
  • 6.5. Java примеры – Вычисление факториала числа
  • 6.6. Java примеры – Переопределение метода
  • 6.7. Java примеры – Вывод массива с использованием метода
  • 6.8. Java примеры – Использование оператора break
  • 6.9. Java примеры – Использование оператора continue
  • 6.10. Java примеры – Использование метки в методе
  • 6.11. Java примеры – Использование операторов enum и switch
  • 6.12. Java примеры – Использование конструктора enum

Объединение / смешивание двух массивов

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

String s = "" + a; String[] arr = s.split(""); System.out.println(arr); 

На этом у меня все встало. В пошаговой отладке eclipse — массив arr строковый и получает значения [1,2,3,4] и второй массив, соответственно, [5,6,7,8] . На выходе же sysout выдает что то типа [Ljava.lang.String;@5fcfe4b2 , и как то дальше совсем не идет, может быть я с самого начала не в том направлении мыслю?

Отслеживать
задан 24 апр 2015 в 7:29
11 3 3 бронзовых знака

а использовать грязный хак типа return 15256836 + a + b не подходит? Насколько я понимаю, условию это не противоречит

Logical AND (&&)

The logical AND ( && ) (logical conjunction) operator for a set of boolean operands will be true if and only if all the operands are true . Otherwise it will be false .

More generally, the operator returns the value of the first falsy operand encountered when evaluating from left to right, or the value of the last operand if they are all truthy.

Try it

Syntax

Description

If a value can be converted to true , the value is so-called truthy. If a value can be converted to false , the value is so-called falsy.

Examples of expressions that can be converted to false are:

  • false ;
  • null ;
  • NaN ;
  • 0 ;
  • empty string ( «» or » or « );
  • undefined .

The AND operator preserves non-Boolean values and returns them as they are:

= "" && "foo"; // result is assigned "" (empty string) result = 2 && 0; // result is assigned 0 result = "foo" && 4; // result is assigned 4 

Even though the && operator can be used with non-Boolean operands, it is still considered a boolean operator since its return value can always be converted to a boolean primitive. To explicitly convert its return value (or any expression in general) to the corresponding boolean value, use a double NOT operator or the Boolean constructor.

Short-circuit evaluation

The logical AND expression is a short-circuit operator. As each operand is converted to a boolean, if the result of one conversion is found to be false , the AND operator stops and returns the original value of that falsy operand; it does not evaluate any of the remaining operands.

Consider the pseudocode below.

(some falsy expression) && expr

The expr part is never evaluated because the first operand (some falsy expression) is evaluated as falsy. If expr is a function, the function is never called. See the example below:

function A()  console.log("called A"); return false; > function B()  console.log("called B"); return true; > console.log(A() && B()); // Logs "called A" to the console due to the call for function A, // && evaluates to false (function A returns false), then false is logged to the console; // the AND operator short-circuits here and ignores function B 

Operator precedence

The AND operator has a higher precedence than the OR operator, meaning the && operator is executed before the || operator (see operator precedence).

true || false && false; // true true && (false || false); // false (2 === 3) || (4  0) && (1 === 1); // false 

Examples

Using AND

The following code shows examples of the && (logical AND) operator.

= true && true; // t && t returns true a2 = true && false; // t && f returns false a3 = false && true; // f && t returns false a4 = false && 3 === 4; // f && f returns false a5 = "Cat" && "Dog"; // t && t returns "Dog" a6 = false && "Cat"; // f && t returns false a7 = "Cat" && false; // t && f returns false a8 = "" && false; // f && f returns "" a9 = false && ""; // f && f returns false 

Conversion rules for booleans

Converting AND to OR

The following operation involving booleans:

&& bCondition2 

is always equal to:

!(!bCondition1 || !bCondition2) 
Converting OR to AND

The following operation involving booleans:

|| bCondition2 

is always equal to:

!(!bCondition1 && !bCondition2) 

Removing nested parentheses

As logical expressions are evaluated left to right, it is always possible to remove parentheses from a complex expression provided that certain rules are followed.

The following composite operation involving booleans:

|| (bCondition2 && bCondition3) 

is always equal to:

|| bCondition2 && bCondition3 

Specifications

Specification
ECMAScript Language Specification
# prod-LogicalANDExpression

Browser compatibility

BCD tables only load in the browser

Объединить два массива в Java

В этом уроке мы собираемся обсудить, как объединить два массива в Java.

Во-первых, мы реализуем наши собственные методы с помощью стандартного Java API.

Затем мы рассмотрим, как решить проблему с помощью часто используемых библиотек.

2. Введение в проблему​

Быстрые примеры могут ясно объяснить проблему.

Допустим, у нас есть два массива:

 String[] strArray1 = "element 1", "element 2", "element 3">;   String[] strArray2 = "element 4", "element 5">; 

Теперь мы хотим присоединиться к ним и получить новый массив:

 String[] expectedStringArray = "element 1", "element 2", "element 3", "element 4", "element 5"> 

Кроме того, мы не хотим, чтобы наш метод работал только с массивами String , поэтому мы будем искать универсальное решение .

Кроме того, мы не должны забывать случаи с примитивными массивами. Было бы хорошо, если бы наше решение работало и для примитивных массивов:

 int[] intArray1 =  0, 1, 2, 3 >;   int[] intArray2 =  4, 5, 6, 7 >;   int[] expectedIntArray =  0, 1, 2, 3, 4, 5, 6, 7 >; 

В этом руководстве мы рассмотрим различные подходы к решению проблемы.

3. Использование коллекций Java ​

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

Что ж, в Java нет вспомогательного метода для объединения массивов. Однако, начиная с Java 5, служебный класс Collections представил метод addAll(Collection c, T… elements) .

Мы можем создать объект List , а затем дважды вызвать этот метод, чтобы добавить два массива в список. Наконец, мы преобразуем полученный список обратно в массив:

 static T> T[] concatWithCollection(T[] array1, T[] array2)    ListT> resultList = new ArrayList>(array1.length + array2.length);   Collections.addAll(resultList, array1);   Collections.addAll(resultList, array2);    @SuppressWarnings("unchecked")   //the type cast is safe as the array1 has the type T[]   T[] resultArray = (T[]) Array.newInstance(array1.getClass().getComponentType(), 0);   return resultList.toArray(resultArray);   > 

В приведенном выше методе мы используем API отражения Java для создания универсального экземпляра массива: resultArray.

Давайте напишем тест, чтобы проверить, работает ли наш метод:

 @Test   public void givenTwoStringArrays_whenConcatWithList_thenGetExpectedResult()    String[] result = ArrayConcatUtil.concatWithCollection(strArray1, strArray2);   assertThat(result).isEqualTo(expectedStringArray);   > 

Если мы выполним тест, он пройдет.

Этот подход довольно прост. Однако, поскольку метод принимает массивы T[] , он не поддерживает объединение примитивных массивов .

Кроме того, он неэффективен, так как создает объект ArrayList , а позже мы вызываем метод toArray() , чтобы преобразовать его обратно в массив . В этой процедуре объект списка Java добавляет ненужные накладные расходы.

Далее, давайте посмотрим, сможем ли мы найти более эффективный способ решения проблемы.

4. Использование техники копирования массива​

Java не предлагает метод объединения массивов, но предоставляет два метода копирования массивов: System.arraycopy() и Arrays.copyOf() .

Мы можем решить эту проблему, используя методы копирования массива Java.

Идея в том, что мы создаем новый массив, скажем, результат , который имеет результат . length = array1.length + array2.length и скопируйте элементы каждого массива в результирующий массив.

4.1. Непримитивные массивы​

Во-первых, давайте посмотрим на реализацию метода:

 static T> T[] concatWithArrayCopy(T[] array1, T[] array2)    T[] result = Arrays.copyOf(array1, array1.length + array2.length);   System.arraycopy(array2, 0, result, array1.length, array2.length);   return result;   > 

Метод выглядит компактно. Кроме того, весь метод создал только один новый объект массива: результат .

Теперь давайте напишем тестовый метод, чтобы проверить, работает ли он так, как мы ожидаем:

 @Test   public void givenTwoStringArrays_whenConcatWithCopy_thenGetExpectedResult()    String[] result = ArrayConcatUtil.concatWithArrayCopy(strArray1, strArray2);   assertThat(result).isEqualTo(expectedStringArray);   > 

Тест пройдет, если мы его прогоним.

Нет ненужного создания объектов. Таким образом, этот метод более производительный, чем подход с использованием Java Collections .

С другой стороны, этот общий метод принимает параметры только с типом T[] . Поэтому мы не можем передавать в метод примитивные массивы.

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

Далее давайте подробнее рассмотрим, как добавить поддержку примитивных массивов.

4.2. Добавить поддержку примитивных массивов​

Чтобы метод поддерживал примитивные массивы, нам нужно изменить тип параметров с T[] на T и выполнить некоторые проверки безопасности типов.

Во-первых, давайте взглянем на модифицированный метод:

 static T> T concatWithCopy2(T array1, T array2)    if (!array1.getClass().isArray() || !array2.getClass().isArray())    throw new IllegalArgumentException("Only arrays are accepted.");   >    Class?> compType1 = array1.getClass().getComponentType();   Class?> compType2 = array2.getClass().getComponentType();    if (!compType1.equals(compType2))    throw new IllegalArgumentException("Two arrays have different types.");   >    int len1 = Array.getLength(array1);   int len2 = Array.getLength(array2);    @SuppressWarnings("unchecked")   //the cast is safe due to the previous checks   T result = (T) Array.newInstance(compType1, len1 + len2);    System.arraycopy(array1, 0, result, 0, len1);   System.arraycopy(array2, 0, result, len1, len2);    return result;   > 

Очевидно, что метод concatWithCopy2() длиннее оригинальной версии. Но это не трудно понять. Теперь давайте быстро пройдемся по нему, чтобы понять, как он работает.

Поскольку метод теперь допускает параметры с типом T , нам нужно убедиться, что оба параметра являются массивами :

 if (!array1.getClass().isArray() || !array2.getClass().isArray())    throw new IllegalArgumentException("Only arrays are accepted.");   > 

Это все еще недостаточно безопасно, если два параметра являются массивами. Например, мы не хотим объединять массив Integer[] и массив String[] . Итак, нам нужно убедиться, что ComponentType двух массивов идентичен :

 if (!compType1.equals(compType2))    throw new IllegalArgumentException("Two arrays have different types.");   > 

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

4.3. Тестирование метода concatWithCopy2() ​

Далее давайте проверим, работает ли наш новый метод так, как мы ожидали. Во-первых, мы передаем два объекта, не являющихся массивами, и смотрим, вызывает ли метод ожидаемое исключение:

 @Test   public void givenTwoStrings_whenConcatWithCopy2_thenGetException()    String exMsg = "Only arrays are accepted.";   try    ArrayConcatUtil.concatWithCopy2("String Nr. 1", "String Nr. 2");   fail(String.format("IllegalArgumentException with message:'%s' should be thrown. But it didn't", exMsg));   > catch (IllegalArgumentException e)    assertThat(e).hasMessage(exMsg);   >   > 

В приведенном выше тесте мы передаем методу два объекта String . Если мы выполняем тест, он проходит. Это означает, что мы получили ожидаемое исключение.

Наконец, давайте создадим тест, чтобы проверить, может ли новый метод объединять примитивные массивы:

 @Test   public void givenTwoArrays_whenConcatWithCopy2_thenGetExpectedResult()    String[] result = ArrayConcatUtil.concatWithCopy2(strArray1, strArray2);   assertThat(result).isEqualTo(expectedStringArray);    int[] intResult = ArrayConcatUtil.concatWithCopy2(intArray1, intArray2);   assertThat(intResult).isEqualTo(expectedIntArray);   > 

На этот раз мы дважды вызвали метод concatWithCopy2() . Сначала мы передаем два массива String[] . Затем мы передаем два примитивных массива int[] .

Тест пройдет, если мы его запустим. Теперь мы можем сказать, что метод concatWithCopy2() работает так, как мы и ожидали.

5. Использование Java Stream API​

Если версия Java, с которой мы работаем, — 8 или новее, доступен Stream API . Мы также можем решить проблему с помощью Stream API.

Во- первых, мы можем получить поток из массива с помощью метода Arrays.stream() . Кроме того, класс Stream предоставляет статический метод concat() для объединения двух объектов Stream .

Теперь давайте посмотрим, как объединить два массива с помощью Stream.

5.1. Объединение непримитивных массивов​

Создание универсального решения с использованием Java Streams довольно просто:

 static T> T[] concatWithStream(T[] array1, T[] array2)    return Stream.concat(Arrays.stream(array1), Arrays.stream(array2))   .toArray(size -> (T[]) Array.newInstance(array1.getClass().getComponentType(), size));   > 

Сначала мы преобразуем два входных массива в объекты Stream . Во-вторых, мы объединяем два объекта Stream с помощью метода Stream.concat() .

Наконец, мы возвращаем массив, содержащий все элементы объединенного потока.

Далее давайте создадим простой тестовый метод, чтобы проверить, работает ли решение:

 @Test   public void givenTwoStringArrays_whenConcatWithStream_thenGetExpectedResult()    String[] result = ArrayConcatUtil.concatWithStream(strArray1, strArray2);   assertThat(result).isEqualTo(expectedStringArray);   > 

Тест пройдет, если мы передадим два массива String[] .

Наверное, мы заметили, что наш универсальный метод принимает параметры типа T[] . Поэтому он не будет работать для примитивных массивов .

Далее давайте посмотрим, как объединить два примитивных массива с помощью Java Streams.

5.2. Объединение примитивных массивов​

Stream API предоставляет различные классы Stream , которые могут преобразовывать объект Stream в соответствующий примитивный массив, например IntStream , LongStream и DoubleStream .

Однако только int , long и double имеют свои типы Stream . То есть, если примитивные массивы, которые мы хотим объединить, имеют тип int[] , long[] или double[] , мы можем выбрать правильный класс Stream и вызвать метод concat() .

Давайте посмотрим на пример объединения двух массивов int[] с помощью IntStream :

 static int[] concatIntArraysWithIntStream(int[] array1, int[] array2)    return IntStream.concat(Arrays.stream(array1), Arrays.stream(array2)).toArray();   > 

Как показано выше, метод Arrays.stream(int[]) возвращает объект IntStream .

Кроме того, метод IntStream.toArray() возвращает int[] . Поэтому нам не нужно заботиться о преобразованиях типов.

Как обычно, давайте создадим тест, чтобы увидеть, работает ли он с нашими входными данными int[] :

 @Test   public void givenTwoIntArrays_whenConcatWithIntStream_thenGetExpectedResult()    int[] intResult = ArrayConcatUtil.concatIntArraysWithIntStream(intArray1, intArray2);   assertThat(intResult).isEqualTo(expectedIntArray);   > 

Если мы проведем тест, он пройдет.

6. Использование библиотеки Apache Commons Lang​

Библиотека Apache Commons Lang широко используется в приложениях Java в реальном мире.

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

Класс ArrayUtils предоставляет ряд методов addAll() , которые поддерживают объединение как непримитивных, так и примитивных массивов.

Проверим это тестовым методом:

 @Test   public void givenTwoArrays_whenConcatWithCommonsLang_thenGetExpectedResult()    String[] result = ArrayUtils.addAll(strArray1, strArray2);   assertThat(result).isEqualTo(expectedStringArray);    int[] intResult = ArrayUtils.addAll(intArray1, intArray2);   assertThat(intResult).isEqualTo(expectedIntArray);   > 

Внутри методы ArrayUtils.addAll() используют производительный метод System.arraycopy() для объединения массивов.

7. Использование библиотеки гуавы​

Подобно библиотеке Apache Commons, Guava — еще одна библиотека, любимая многими разработчиками.

Guava также предоставляет удобные вспомогательные классы для объединения массивов.

Если мы хотим объединить непримитивные массивы, хорошим выбором будет метод ObjectArrays.concat() :

 @Test   public void givenTwoStringArrays_whenConcatWithGuava_thenGetExpectedResult()    String[] result = ObjectArrays.concat(strArray1, strArray2, String.class);   assertThat(result).isEqualTo(expectedStringArray);   > 

Guava предлагает примитивные утилиты для каждого примитива. Все примитивные утилиты предоставляют ` метод concat()` для объединения массивов с соответствующими типами, например:

  • int[] – Гуава: Ints.concat(int[] … массивы)
  • long[] – Гуава: Longs.concat(long[] … массивы)
  • byte[] – Guava: Bytes.concat(byte[] … массивы)
  • double[] — Guava: Doubles.concat(double[] … массивы)

Мы можем просто выбрать правильный примитивный служебный класс для конкатенации примитивных массивов.

Далее давайте объединим наши два массива int[] с помощью метода Ints.concat() :

 @Test   public void givenTwoIntArrays_whenConcatWithGuava_thenGetExpectedResult()    int[] intResult = Ints.concat(intArray1, intArray2);   assertThat(intResult).isEqualTo(expectedIntArray);   > 

Точно так же Guava внутренне использует System.arraycopy() в вышеупомянутых методах для объединения массивов для повышения производительности.

8. Заключение​

В этой статье мы рассмотрели различные подходы к объединению двух массивов в Java на примерах.

Как обычно, полные примеры кода, сопровождающие эту статью, доступны на GitHub.

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

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