Какой самый простой способ напечатать массив Java? - PullRequest
1762 голосов
/ 03 января 2009

В Java массивы не переопределяют toString(), поэтому, если вы попытаетесь напечатать один непосредственно, вы получите className + @ + шестнадцатеричный код hashCode массива, как определено Object.toString():

int[] intArray = new int[] {1, 2, 3, 4, 5};
System.out.println(intArray);     // prints something like '[I@3343c8b3'

Но обычно нам бы хотелось чего-то большего, чем [1, 2, 3, 4, 5]. Какой самый простой способ сделать это? Вот несколько примеров входов и выходов:

// array of primitives:
int[] intArray = new int[] {1, 2, 3, 4, 5};
//output: [1, 2, 3, 4, 5]

// array of object references:
String[] strArray = new String[] {"John", "Mary", "Bob"};
//output: [John, Mary, Bob]

Ответы [ 32 ]

2350 голосов
/ 03 января 2009

Начиная с Java 5 вы можете использовать Arrays.toString(arr) или Arrays.deepToString(arr) для массивов внутри массивов. Обратите внимание, что версия Object[] вызывает .toString() для каждого объекта в массиве. Вывод даже оформлен именно так, как вы просите.

Примеры:

  • Простой массив:

    String[] array = new String[] {"John", "Mary", "Bob"};
    System.out.println(Arrays.toString(array));
    

    Выход:

    [John, Mary, Bob]
    
  • Вложенный массив:

    String[][] deepArray = new String[][] {{"John", "Mary"}, {"Alice", "Bob"}};
    System.out.println(Arrays.toString(deepArray));
    //output: [[Ljava.lang.String;@106d69c, [Ljava.lang.String;@52e922]
    System.out.println(Arrays.deepToString(deepArray));
    

    Выход:

    [[John, Mary], [Alice, Bob]]
    
  • double Массив:

    double[] doubleArray = { 7.0, 9.0, 5.0, 1.0, 3.0 };
    System.out.println(Arrays.toString(doubleArray));
    

    Выход:

    [7.0, 9.0, 5.0, 1.0, 3.0 ]
    
  • int Массив:

    int[] intArray = { 7, 9, 5, 1, 3 };
    System.out.println(Arrays.toString(intArray));
    

    Выход:

    [7, 9, 5, 1, 3 ]
    
334 голосов
/ 03 января 2009

Всегда сначала проверяйте стандартные библиотеки. Попробуйте:

System.out.println(Arrays.toString(array));

или если ваш массив содержит другие массивы в качестве элементов:

System.out.println(Arrays.deepToString(array));
99 голосов
/ 13 мая 2010

Приятно знать, однако, что «всегда сначала проверяйте стандартные библиотеки», я бы никогда не наткнулся на уловку Arrays.toString( myarray )

- поскольку я сосредоточился на типе myarray, чтобы увидеть, как это сделать. Я не хотел повторять эту вещь: я хотел простой вызов, чтобы сделать его похожим на то, что я вижу в отладчике Eclipse, а myarray.toString () просто не делал этого.

import java.util.Arrays;
.
.
.
System.out.println( Arrays.toString( myarray ) );
81 голосов
/ 07 февраля 2014

В JDK1.8 вы можете использовать агрегатные операции и лямбда-выражение:

String[] strArray = new String[] {"John", "Mary", "Bob"};

// #1
Arrays.asList(strArray).stream().forEach(s -> System.out.println(s));

// #2
Stream.of(strArray).forEach(System.out::println);

// #3
Arrays.stream(strArray).forEach(System.out::println);

/* output:
John
Mary
Bob
*/
40 голосов
/ 04 января 2009

Если вы используете Java 1.4, вместо этого вы можете сделать:

System.out.println(Arrays.asList(array));

(Конечно, работает и в версии 1.5+.)

37 голосов
/ 23 декабря 2015

Начиная с Java 8, можно также использовать метод join(), предоставляемый классом String , для распечатки элементов массива без скобок, разделенных выбранным разделителем ( пробел для примера, показанного ниже):

String[] greeting = {"Hey", "there", "amigo!"};
String delimiter = " ";
String.join(delimiter, greeting) 

Вывод будет "Привет, амиго!".

31 голосов
/ 11 марта 2016

Arrays.toString

В качестве прямого ответа, решение, предоставленное несколькими, включая @ Esko с использованием методов Arrays.toString и Arrays.deepToString, является просто лучший.

Java 8 - Stream.collect (joining ()), Stream.forEach

Ниже я попытаюсь перечислить некоторые из других предложенных методов, пытаясь немного улучшить их, при этом наиболее заметным дополнением является использование оператора Stream.collect с использованием joining Collector, чтобы имитировать то, что делает String.join.

int[] ints = new int[] {1, 2, 3, 4, 5};
System.out.println(IntStream.of(ints).mapToObj(Integer::toString).collect(Collectors.joining(", ")));
System.out.println(IntStream.of(ints).boxed().map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(ints));

String[] strs = new String[] {"John", "Mary", "Bob"};
System.out.println(Stream.of(strs).collect(Collectors.joining(", ")));
System.out.println(String.join(", ", strs));
System.out.println(Arrays.toString(strs));

DayOfWeek [] days = { FRIDAY, MONDAY, TUESDAY };
System.out.println(Stream.of(days).map(Object::toString).collect(Collectors.joining(", ")));
System.out.println(Arrays.toString(days));

// These options are not the same as each item is printed on a new line:
IntStream.of(ints).forEach(System.out::println);
Stream.of(strs).forEach(System.out::println);
Stream.of(days).forEach(System.out::println);
29 голосов
/ 19 июня 2015

До Java 8

Мы могли бы использовать Arrays.toString(array) для печати одномерного массива и Arrays.deepToString(array) для многомерных массивов.

Java 8

Теперь у нас есть опция Stream и lambda для печати массива.

Печать одномерного массива:

public static void main(String[] args) {
    int[] intArray = new int[] {1, 2, 3, 4, 5};
    String[] strArray = new String[] {"John", "Mary", "Bob"};

    //Prior to Java 8
    System.out.println(Arrays.toString(intArray));
    System.out.println(Arrays.toString(strArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(intArray).forEach(System.out::println);
    Arrays.stream(strArray).forEach(System.out::println);
}

Вывод:

[1, 2, 3, 4, 5]
[Джон, Мэри, Боб]
1
2
3
4
5
John
Mary
Боб

Печать многомерного массива На всякий случай, если мы хотим напечатать многомерный массив, мы можем использовать Arrays.deepToString(array) как:

public static void main(String[] args) {
    int[][] int2DArray = new int[][] { {11, 12}, { 21, 22}, {31, 32, 33} };
    String[][] str2DArray = new String[][]{ {"John", "Bravo"} , {"Mary", "Lee"}, {"Bob", "Johnson"} };

    //Prior to Java 8
    System.out.println(Arrays.deepToString(int2DArray));
    System.out.println(Arrays.deepToString(str2DArray));

    // In Java 8 we have lambda expressions
    Arrays.stream(int2DArray).flatMapToInt(x -> Arrays.stream(x)).forEach(System.out::println);
    Arrays.stream(str2DArray).flatMap(x -> Arrays.stream(x)).forEach(System.out::println);
} 

Теперь отметим, что метод Arrays.stream(T[]), который в случае int[] возвращает нас Stream<int[]>, а затем метод flatMapToInt() отображает каждый элемент потока с содержимым отображенного потока, полученного путем применения предусмотрена функция сопоставления для каждого элемента.

Вывод:

[[11, 12], [21, 22], [31, 32, 33]]
[[Джон, Браво], [Мэри, Ли], [Боб, Джонсон]]
11
12
21
22
31
32
33
John
Bravo
Mary
Lee
Боб
Johnson

28 голосов
/ 05 октября 2013

Arrays.deepToString(arr) печатает только в одну строку.

int[][] table = new int[2][2];

Чтобы на самом деле получить таблицу для печати в виде двумерной таблицы, я должен был сделать это:

System.out.println(Arrays.deepToString(table).replaceAll("],", "]," + System.getProperty("line.separator")));

Кажется, что метод Arrays.deepToString(arr) должен принимать строку-разделитель, но, к сожалению, это не так.

19 голосов
/ 24 января 2011
for(int n: someArray) {
    System.out.println(n+" ");
}
...