Перейти к основному содержимому

Присоединить массив примитивов с разделителем в Java

· 4 мин. чтения

Задача: Сумма двух чисел

Напишите функцию twoSum. Которая получает массив целых чисел nums и целую сумму target, а возвращает индексы двух чисел, сумма которых равна target. Любой набор входных данных имеет ровно одно решение, и вы не можете использовать один и тот же элемент дважды. Ответ можно возвращать в любом порядке...

ANDROMEDA

1. Введение

В этом кратком руководстве мы узнаем, как объединить массив примитивов с односимвольным разделителем в Java . В наших примерах мы рассмотрим два массива: массив int и массив char .

2. Определение проблемы

Давайте начнем с определения массива int и массива char для примеров, а также символа-разделителя, который мы будем использовать для соединения их содержимого:

int[] intArray = {1, 2, 3, 4, 5, 6, 7, 8, 9};
char[] charArray = {'a', 'b', 'c', 'd', 'e', 'f'};
char separatorChar = '-';
String separator = String.valueOf(separatorChar);

Обратите внимание, что мы включили разделитель char и String , так как некоторые методы, которые мы покажем, требуют аргумента char , а другие требуют аргумента String .

Результаты операции соединения будут содержать «1-2-3-4-5-6-7-8-9» для массива int и «abcdef» для массива char .

3. Коллекторы.соединение()

Начнем с одного из доступных методов Java 8 Stream API — Collectors.joining() .

Во-первых, мы создаем Stream из массива примитивов, используя метод Arrays.stream() из пакета java.util . Затем мы сопоставляем каждый элемент со строкой . И, наконец, мы объединяем элементы с заданным разделителем.

Начнем с нашего массива int :

String joined = Arrays.stream(intArray)
.mapToObj(String::valueOf)
.collect(Collectors.joining(separator));

При объединении нашего массива символов с помощью этого метода мы должны сначала обернуть массив символов в CharBuffer , а затем снова спроецировать его в char . Это связано с тем, что метод chars() возвращает поток значений int .

К сожалению, Java Stream API не предоставляет собственного метода для упаковки Stream из char .

Давайте присоединимся к нашему массиву символов :

String joined = CharBuffer.wrap(charArray).chars()
.mapToObj(intValue -> String.valueOf((char) intValue))
.collect(Collectors.joining(separator));

4. Объединение строк

Подобно Collectors.joining() , этот подход использует Stream API, но вместо сбора элементов он перебирает элементы и добавляет их в экземпляр StringJoiner :

StringJoiner intStringJoiner = new StringJoiner(separator);
Arrays.stream(intArray)
.mapToObj(String::valueOf)
.forEach(intStringJoiner::add);
String joined = intStringJoiner.toString();

Опять же, мы должны обернуть наш массив символов в CharBuffer при использовании Stream API:

StringJoiner charStringJoiner = new StringJoiner(separator);
CharBuffer.wrap(charArray).chars()
.mapToObj(intChar -> String.valueOf((char) intChar))
.forEach(charStringJoiner::add);
String joined = charStringJoiner.toString();

5. Язык Apache Commons

Библиотека Apache Commons Lang предоставляет несколько удобных методов в классах StringUtils и ArrayUtils , которые мы можем использовать для объединения наших примитивных массивов.

Чтобы использовать эту библиотеку, нам нужно добавить зависимость commons-lang3 к нашему pom.xml : ``

<dependency>
<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.12.0</version>
</dependency>

При работе с разделителем строк мы будем использовать как StringUtils, так и ArrayUtils .

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

String joined = StringUtils.join(ArrayUtils.toObject(intArray), separator);

Или, если мы используем примитивный тип char в качестве разделителя, мы можем просто написать:

String joined = StringUtils.join(intArray, separatorChar);

Реализации для объединения нашего массива символов очень похожи:

String joined = StringUtils.join(ArrayUtils.toObject(charArray), separator);

И при использовании разделителя символов :

String joined = StringUtils.join(charArray, separatorChar);

6. Гуава

Библиотека Google Guava предоставляет класс Joiner , который мы можем использовать для объединения наших массивов. Чтобы использовать Guava в нашем проекте, нам нужно добавить зависимость guava Maven :

<dependency>
<groupId>com.google.guava</groupId>
<artifactId>guava</artifactId>
<version>31.0.1-jre</version>
</dependency>

Давайте присоединимся к нашему массиву int , используя класс Joiner :

String joined = Joiner.on(separator).join(Ints.asList(intArray));

В этом примере мы также использовали метод Ints.asList() из Guava, который прекрасно преобразует массив примитивов в список Integer .

Guava предлагает аналогичный метод преобразования массива символов в список символов . В результате объединение нашего массива char очень похоже на приведенный выше пример, в котором использовался массив int :

String joined = Joiner.on(separator).join(Chars.asList(charArray));

7. Построитель строк

Наконец, если мы не можем использовать ни Java 8, ни сторонние библиотеки, мы можем вручную объединить массив элементов с помощью StringBuilder . В этом случае реализация идентична для обоих типов массивов:

if (array.length == 0) {
return "";
}
StringBuilder stringBuilder = new StringBuilder();
for (int i = 0; i < array.length - 1; i++) {
stringBuilder.append(array[i]);
stringBuilder.append(separator);
}
stringBuilder.append(array[array.length - 1]);
String joined = stringBuilder.toString();

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

В этой быстрой статье показано несколько способов соединения массива примитивов с заданным символом-разделителем или строкой. Мы показали примеры с использованием нативных решений JDK, а также дополнительные решения с использованием двух сторонних библиотек — Apache Commons Lang и Guava.

Как всегда, полный код, использованный в этой статье, доступен на GitHub .