Java: объединение массива примитивов с разделителем

Предположим, у меня есть массив:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};

И мне нужно объединить его элементы с помощью разделителя, например, " - ", так что в результате я должен получить строку следующим образом:

"1 - 2 - 3 - 4 - 5 - 6 - 7"

Как я могу это сделать?

PS: да, я знаю этот и этот, но его решения не будут работать с массивом примитивов.

Ответы

Ответ 1

Вот что я придумал. Есть несколько способов сделать это, и они зависят от используемых вами инструментов.


Используя StringUtils и ArrayUtils из Common Lang:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = StringUtils.join(ArrayUtils.toObject(arr), " - ");

Вы не можете просто использовать StringUtils.join(arr, " - ");, потому что StringUtils не имеет этой перегруженной версии метода. Хотя он имеет метод StringUtils.join(int[], char).

Работает в любой версии Java, начиная с версии 1.2.


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

Что-то вроде этого:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = Arrays.stream(arr)
        .mapToObj(String::valueOf)
        .collect(Collectors.joining(" - "));

На самом деле существует множество вариантов достижения результата с использованием потоков.

Метод Java 8 String.join() работает только со строками, поэтому для его использования вам все равно нужно преобразовать int[] в String[].

String[] sarr = Arrays.stream(arr).mapToObj(String::valueOf).toArray(String[]::new);
String result = String.join(" - ", sarr);

Если вы застряли с использованием Java 7 или более ранней версии без библиотек, вы можете написать свой собственный метод утилиты:

public static String myJoin(int[] arr, String separator) {
    if (null == arr || 0 == arr.length) return "";

    StringBuilder sb = new StringBuilder(256);
    sb.append(arr[0]);

    //if (arr.length == 1) return sb.toString();

    for (int i = 1; i < arr.length; i++) sb.append(separator).append(arr[i]);

    return sb.toString();
}

Чем вы можете это сделать:

int[] arr = new int[] {1, 2, 3, 4, 5, 6, 7};
String result = myJoin(arr, " - ");

Ответ 2

В Java 8+ вы можете использовать IntStream и StringJoiner. Что-то вроде,

int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };
StringJoiner sj = new StringJoiner(" - ");
IntStream.of(arr).forEach(x -> sj.add(String.valueOf(x)));
System.out.println(sj.toString());

Выход (по запросу)

1 - 2 - 3 - 4 - 5 - 6 - 7

Ответ 3

Вы можете использовать Guava для соединения элементов. Дополнительные примеры и документы вы можете найти там. https://github.com/google/guava/wiki/StringsExplained

Joiner.on("-")
      .join(texts);

Чтобы быть более точным, вы должны сначала перенести свой массив в List с помощью Arrays.asList() или Guava примитивные дружественные.

Joiner.on("-")
      .join(Arrays.asList(1, 2, 3, 4, 5, 6, 7));

Joiner.on("-")
      .join(Ints.asList(arr));

Ответ 4

Я уверен, что есть способ сделать это в Kotlin/ Scala или других языках JVM, но вы всегда можете придерживаться простых вещей для небольшого набора значений, как у вас выше:

int i, arrLen = arr.length;
 StringBuilder tmp = new StringBuilder();
 for (i=0; i<arrLen-1; i++)
    tmp.append(arr[i] +" - ");
 tmp.append(arr[arrLen-1]);

 System.out.println( tmp.toString() );

Ответ 5

int[] arr = new int[] { 1, 2, 3, 4, 5, 6, 7 };

IntStream.of(arr).mapToObj(i -> String.valueOf(i)).collect(Collectors.joining(",")) ;

Ответ 6

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

LongStream.range(0, 500).boxed().collect(Collector.of(StringBuilder::new, (sb, v) -> {
    if (sb.length() != 0)
        sb.append(',');
    sb.append(v.longValue());
}, (a, b) -> a.length() == 0 ? b : b.length() != 0 ? a.append(',').append(b) : a, StringBuilder::toString));

Ответ 7

Решение Java 8 будет выглядеть следующим образом:

Stream.of(1,2,3,4).map(String::valueOf).collect(Collectors.joining("-"))

Ответ 8

Для Java 7 или более ранней версии.

public static StringBuilder join(CharSequence delimiter, int... arr) {
    if (null == delimiter || null == arr) throw new NullPointerException();

    StringBuilder sb = new StringBuilder(String.valueOf(arr[0]));
    for (int i = 1; i < arr.length; i++) sb.append(delimiter).append(arr[i]);

    return sb;
}

public static void main(String[] args) {
    StringBuilder sb = join(" - ", 1, 2, 3, 4);
    System.out.println(sb.toString());//you could pass sb also coz println automatically call toString method within it
    System.out.println(sb.insert(0, "[").append("]"));
}

Output:

1 - 2 - 3 - 4

[1 - 2 - 3 - 4]