Как привести к строке и напечатать массив (в т.ч. многомерный) в Java

Массивы в Java не переопределяют метод toString(), поэтому при попытке привести значение переменной-массива к строке мы получим что-то вроде [I@55f96302, вместо конкретных данных, содержащихся в массиве в виде строки:
int[] nums = {1,2};
String asStr = String.valueOf(nums);System.out.println(asStr);
Данный код выведет что-то подобное [I@55f96302. И даже массив строк превратится во что-то похожее на [Ljava.lang.String;@55f96302 вместо реальных строк в массиве.
Для приведения массивов к строкам с получением адекватных результатов ([1,2,3] или ["раз", "два", "три"] начиная с Java 5 используются методы класса Arrays:
- Arrays.toString(arr) для одномерных массивов- Arrays.deepToString(arr) для многомерных массивов
Например:
int[] nums = {1,2,3};System.out.println(Arrays.toString(nums));
String[][] strs = {{"раз", "два"}, {"три"}};System.out.println(Arrays.deepToString(strs));
Выведет [1, 2, 3] и [[раз, два], [три] соответственно. Обратите внимание, что метод deepToString() прекрасно справляется с многомерными массивами произвольной размерности.

Приведение к строке с разделителем


Методы класса Arrays приводят данные массивов к строкам со скобками (например, [1, 2, 3]). Это не всегда то, что нам нужно. До версии Java 8, нам пришлось бы "руками" обрабатывать такую строку, удаляя скобки и вставляя собственный разделитель. Начиная с Java 8 нам доступен метод join() класса String, который может приводить к строке с разделителями массивы строк (только String[]), что, конечно, не решает всех проблем, но в целом облегчает жизнь:
String[] names = {"Peter", "Anna"};System.out.println(String.join(", ", names));
Выведет Peter, Anna. Помимо того, что этот метод работает только со массивами строк, он совершенно не умеет работать с многомерными массивами:
String[][] strs = {{"Peter", "Anna"}, {"Iren"}};System.out.println(String.join(", ", names));
Также выведет Peter, Anna, совершенно не заметив Ирэн.

Универсальные способы обработки массивов


До версии Java 8, в которой появились стримы, если нам необходимо сделать из массива строку с произвольными разделителями, мы должны были бы написать цикл for, который обходил бы все элементы массива, приводил каждый к строке и конкатенировал их в общую строку с заданным разделителем. Для одномерного массива соответствующий методы выглядел бы так:
public static void main(String[] args) {Integer[] nums = {1,2,3};System.out.println(arrToString(nums, ", "));}
public static <T>String arrToString(T[] arr, String delimiter) {
String result = ""; for (T element : arr) { result += element + delimiter; } return result;}
Код выведет "1, 2, 3" без кавычек. При этом пришлось бы написать по одному подобному методу для массивов примитивных типов, так int[] nums, например, уже не сможет применяться с обобщённым типом T[].
Для двумерного массива пришлось бы писать метод с вложенными циклами for, для многомерного -- усложнять метод рекурсивным подсчётом самих измерений.

Обработка массивов с помощью стримов


Начиная с версии Java 8, класс Array получил метод stream(), который принимает в качестве аргумента массив (в том числе примитивного типа, то есть int[] nums -- пойдёт) и возвращает поток (stream) элементов этого массива. Стримы в свою очередь дают самые гибкие и многогранные возможности дальнейшей обработки элементов. В рамках данного рассмотрения приведём одномерный и многомерные массивы к строкам с заданным разделителем с помощью стримов:
String delimiter = ", ";
int[] nums = {1,2,3};String numsStr = Arrays.stream(nums) .mapToObj(Integer::toString) .collect(Collectors.joining(delimiter));
System.out.println(numsStr);
String[][] names = {{"Peter", "Anna"}, {"Iren"}};String namesStr = Arrays.stream(names) .flatMap(x -> Arrays.stream(x)) .collect(Collectors.joining(delimiter));
System.out.println(namesStr);
Данный код выведет 1, 2, 3 и Peter, Anna, Iren. При необходимости справиться с массивом большей размерности, увеличивается количество вызовов flatMap():
String[][][] names = {{{"Peter", "Anna"}}, {{"Iren", "Nina"}, {"Lola"}}};String namesStr = Arrays.stream(names) .flatMap(x -> Arrays.stream(x)) .flatMap(x -> Arrays.stream(x)) .collect(Collectors.joining(delimiter));
System.out.println(namesStr);
Выведет Peter, Anna, Iren, Nina, Lola.