Pytanie Jaki jest najprostszy sposób wydrukowania tablicy Java?


W Javie tablice nie zastępują toString(), więc jeśli spróbujesz wydrukować jeden bezpośrednio, otrzymasz ClassName + @ + heks z hashCode tablicy, zgodnie z definicją w Object.toString():

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

Ale zwykle chcemy czegoś bardziej podobnego [1, 2, 3, 4, 5]. Jaki jest najprostszy sposób na zrobienie tego? Oto kilka przykładowych wejść i wyjść:

// 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]

1531
2018-01-03 20:39


pochodzenie


Co chcesz reprezentacji dla obiektów innych niż ciągi? Wynik wywołania toString? W cudzysłowach czy nie? - Jon Skeet
Tak obiekty byłyby reprezentowane przez ich metodę toString () i bez cudzysłowów (tylko edytowane przykładowe dane wyjściowe). - Alex Spurling
W praktyce ściśle związane z stackoverflow.com/questions/29140402/... - Raedwald
Ten dziwny wynik niekoniecznie jest lokalizacją w pamięci. To jest hashCode() w systemie szesnastkowym. Widzieć Object#toString(). - 4castle
Aby wydrukować jednowymiarową lub wielowymiarową tablicę w sprawdzeniu java8 stackoverflow.com/questions/409784/... - i_am_zero


Odpowiedzi:


Od wersji Java 5 możesz korzystać Arrays.toString(arr) lub Arrays.deepToString(arr) dla tablic wewnątrz tablic. Zauważ, że Object[] wywołania wersji .toString() na każdym obiekcie w tablicy. Wynik jest nawet udekorowany dokładnie tak, jak pytasz.

Przykłady:

Prosta tablica:

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

Wydajność:

[John, Mary, Bob]

Zagnieżdżona macierz:

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));

Wydajność:

[[John, Mary], [Alice, Bob]]

double Szyk:

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

Wydajność:

[7.0, 9.0, 5.0, 1.0, 3.0 ]

int Szyk:

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

Wydajność:

[7, 9, 5, 1, 3 ]

2042
2018-01-03 20:48



Działa to również w przypadku tablic wielowymiarowych. - Alok Mishra
Co jeśli mamy tablicę łańcuchów i chcemy prostych wyników; lubić: String[] array = {"John", "Mahta", "Sara"}, a my chcemy tego wyniku bez nawiasów i przecinków: John Mahta Sara? - Hengameh
@Hengameh: Jest jeszcze kilka innych sposobów, ale moim ulubionym jest ten: javahotchocolate.com/notes/java.html#arrays-tostring . - Russ Bateman
FYI, Arrays.deepToString() akceptuje tylko Object [] (lub tablica klas, które rozszerzają Object, Jak na przykład Integer, więc nie będzie działać na prymitywnej tablicy typów int []. Ale Arrays.toString(<int array>) działa dobrze dla prymitywnych tablic. - Marcus
@Hengameh Istnieje metoda dedykowana do tego. System.out.println(String.join(" ", new String[]{"John", "Mahta", "Sara"})) wydrukuje John Mahta Sara. - dorukayhan


Zawsze sprawdzaj najpierw standardowe biblioteki. Próbować:

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

lub jeśli twoja tablica zawiera inne tablice jako elementy:

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

305
2018-05-12 21:01



Co jeśli mamy tablicę łańcuchów i chcemy prostych wyników; lubić: String[] array = {"John", "Mahta", "Sara"}, a my chcemy tego wyniku bez nawiasów i przecinków: John Mahta Sara? - Hengameh
@Hengameh Wystarczy zapisać Arrays.toString (tablica) na zmienną łańcuchową, a następnie usunąć nawiasy klamrowe, zastępując metodę Java - Naveed Ahmad
@Hengameh Obecnie z Java 8: String.join(" ", Arrays.asList(array)). doc - Justin


Miło jest jednak wiedzieć, że "zawsze najpierw sprawdzaj standardowe biblioteki" nigdy bym nie natknął się na sztuczkę Arrays.toString( myarray )

- Ponieważ koncentrowałem się na rodzaju myarray, żeby zobaczyć, jak to zrobić. Nie chciałem tego powtarzać: chciałem mieć łatwe wywołanie, żeby było podobne do tego, co widzę w debugerze Eclipse, a myarray.toString () po prostu tego nie robił.

import java.util.Arrays;
.
.
.
System.out.println( Arrays.toString( myarray ) );

85
2018-02-06 23:35



Co jeśli mamy tablicę łańcuchów i chcemy prostych wyników; lubić: String[] array = {"John", "Mahta", "Sara"}, a my chcemy tego wyniku bez nawiasów i przecinków: John Mahta Sara? - Hengameh
@Hengameh Myślę, że to inny temat. Możesz manipulować tym String z typowymi operacjami łańcuchowymi po ... Like Arrays.toString (myarray) .replace ("[", "("); i tak dalej. - OddDev


W JDK1.8 można używać operacji agregujących i wyrażenia lambda:

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
*/

70
2018-01-03 21:44



Lub mniej kłopotliwe, Arrays.stream(strArray).forEach(System.out::println); - Alexis C.
To jest niezgrabne. Powinno być System.out::println która jest referencją do metody Java 8. Kod tworzy niepotrzebny lambda. - Boris the Spider
Po prostu pomiń Arrays.asList i robić Arrays.stream(strArray).forEach(System.out::println) - Justin
@AlexisC. Ponieważ można go również używać z innymi obiektami niż tablice. - Yassin Hajaj
@ YassinHajaj Obie. Na przykład, jeśli chcesz mieć strumień zasięgu przez tablicę w sposób idiomatyczny za pomocą Stream.of byłoby zrobić .skip(n).limit(m). Obecna implementacja nie zwraca strumienia SIZED, podczas gdy Arrays.stream(T[], int, int) ma, prowadząc do lepszej wydajności dzielenia, jeśli chcesz wykonywać operacje równolegle. Także jeśli masz int[], możesz przypadkowo skorzystać Stream.of która zwróci a Stream<int[]> z jednym elementem, podczas gdy Arrays.stream da ci IntStream bezpośrednio. - Alexis C.


Jeśli używasz języka Java 1.4, możesz zamiast tego:

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

(Oczywiście działa to również za 1.5+).


37
2017-12-23 18:51



Niestety działa to tylko z tablicami obiektów, a nie tablicami prymitywów. - Alex Spurling


Począwszy od wersji Java 8, można również skorzystać z join() metoda zapewniona przez Klasa String aby wydrukować elementy tablicy, bez nawiasów, i oddzielone ogranicznikiem wyboru (który jest spacji dla przykładu pokazanego poniżej):

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

Wynik będzie następujący: "Hej, amigo!".


35
2017-10-05 19:13





Arrays.deepToString(arr) tylko drukuje na jednej linii.

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

Aby uzyskać tabelę do wydrukowania jako dwuwymiarowego stołu, musiałem to zrobić:

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

Wygląda na to, że Arrays.deepToString(arr) Metoda powinna przyjąć łańcuch separatora, ale niestety tak nie jest.


27
2018-03-11 05:36



Może użyj System.getProperty ("line.separator"); zamiast \ r \ n tak samo jest w przypadku systemów innych niż Windows. - Scooter
możesz teraz użyć System.lineSeparator () - Novaterata


Arrays.toString

Jako bezpośrednia odpowiedź, rozwiązanie dostarczone przez kilka, w tym @Esko, używając Arrays.toString i Arrays.deepToString metody, jest po prostu najlepsza.

Java 8 - Stream.collect (łączenie ()), Stream.forEach

Poniżej próbuję wymienić niektóre inne sugerowane metody, próbując trochę poprawić, przy czym najbardziej znaczącym dodatkiem jest użycie Stream.collect operator, używając joining  Collector, naśladować to, co String.join to robi.

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);

26
2018-06-19 06:10





Przed wersją Java 8 mogliśmy użyć Arrays.toString(array) wydrukować jednowymiarową tablicę i Arrays.deepToString(array) w przypadku wielowymiarowych tablic. Mamy opcję Stream i lambda w języku Java 8, który może być również użyty do drukowania tablicy.

Drukowanie jednowymiarowe:

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);
}

Wynik to:

[1, 2, 3, 4, 5]
  [John, Mary, Bob]
  1
  2
  3
  4
  5
  Jan
  Mary
  Pion

Drukowanie wielowymiarowej tablicy Na wypadek, gdybyśmy chcieli wydrukować tablicę wielowymiarową, możemy jej użyć Arrays.deepToString(array) tak jak:

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);
} 

Teraz należy zauważyć, że metoda Arrays.stream(T[]), co w przypadku int[] zwraca nam Stream<int[]> a następnie metoda flatMapToInt() mapuje każdy element strumienia z zawartością zmapowanego strumienia wytworzonego przez zastosowanie dostarczonej funkcji odwzorowania do każdego elementu.

Wynik to:

[[11, 12], [21, 22], [31, 32, 33]]
  [[John, Bravo], [Mary, Lee], [Bob, Johnson]]
  11
  12
  21
  22
  31
  32
  33
  Jan
  Brawo
  Mary
  Zawietrzny
  Pion
  Johnson


23
2018-01-24 04:25



Co jeśli mamy tablicę łańcuchów i chcemy prostych wyników; lubić: String[] array = {"John", "Mahta", "Sara"}, a my chcemy tego wyniku bez nawiasów i przecinków: John Mahta Sara? - Hengameh


for(int n: someArray) {
    System.out.println(n+" ");
}

17
2017-08-07 14:05



W ten sposób otrzymasz pustą przestrzeń;) - Matthias
@ matthiad .. ta linia uniknie kończenia z pustą przestrzenią System.out.println (n + (someArray.length == n)? "": ""); - Muhammad Suleman
Najgorszy sposób robienia tego. - NameNotFoundException
Jest to tak nieefektywne, ale dobre dla początkujących. - Raymo111
@MuhammadSuleman To nie działa, ponieważ jest to pętla for-each. n jest rzeczywistą wartością z tablicy, a nie z indeksu. Dla regularnej pętli for, byłaby również (someArray.length - 1) == i, ponieważ łamie się, kiedy i jest równa długości tablicy. - Radiodef