Câu hỏi Cách đơn giản nhất để in một mảng Java là gì?


Trong Java, mảng không ghi đè toString(), vì vậy nếu bạn cố gắng in một cách trực tiếp, bạn sẽ có được className + @ + hex của hashCode của mảng, như được xác định bởi Object.toString():

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

Nhưng thông thường chúng tôi thực sự muốn một cái gì đó giống như [1, 2, 3, 4, 5]. Cách đơn giản nhất để làm điều đó là gì? Dưới đây là một số ví dụ về đầu vào và đầu ra:

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


gốc


Bạn muốn đại diện cho các đối tượng nào ngoài chuỗi? Kết quả của việc gọi toString? Trong báo giá hay không? - Jon Skeet
Các đối tượng có sẽ được biểu diễn bằng phương thức toString () của chúng và không có dấu ngoặc kép (chỉ cần chỉnh sửa kết quả ví dụ). - Alex Spurling
Trong thực tế, liên quan chặt chẽ đến stackoverflow.com/questions/29140402/… - Raedwald
Đầu ra kỳ lạ đó không nhất thiết là vị trí bộ nhớ. Đó là hashCode() trong hệ thập lục phân. Xem Object#toString(). - 4castle
Để in mảng đơn hoặc đa chiều trong kiểm tra java8 stackoverflow.com/questions/409784/… - i_am_zero


Các câu trả lời:


Vì Java 5 bạn có thể sử dụng Arrays.toString(arr) hoặc là Arrays.deepToString(arr) cho mảng trong mảng. Lưu ý rằng Object[] phiên bản cuộc gọi .toString() trên mỗi đối tượng trong mảng. Đầu ra thậm chí được trang trí theo cách chính xác mà bạn đang yêu cầu.

Ví dụ:

Mảng đơn giản:

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

Đầu ra:

[John, Mary, Bob]

Mảng lồng nhau:

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

Đầu ra:

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

double Mảng:

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

Đầu ra:

[7.0, 9.0, 5.0, 1.0, 3.0 ]

int Mảng:

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

Đầu ra:

[7, 9, 5, 1, 3 ]

2042
2018-01-03 20:48



Điều này cũng làm việc cho các mảng đa chiều. - Alok Mishra
Điều gì sẽ xảy ra nếu chúng ta có một chuỗi các chuỗi, và muốn đầu ra đơn giản; như: String[] array = {"John", "Mahta", "Sara"}và chúng tôi muốn đầu ra này không có dấu ngoặc và dấu phẩy: John Mahta Sara? - Hengameh
@ Hengameh: Có một số cách khác để làm điều này, nhưng yêu thích của tôi là cái này: javahotchocolate.com/notes/java.html#arrays-tostring . - Russ Bateman
FYI, Arrays.deepToString() chỉ chấp nhận một Object [] (hoặc một mảng các lớp mở rộng Object, nhu la Integer, do đó, nó sẽ không hoạt động trên một mảng nguyên thủy của loại int []. Nhưng Arrays.toString(<int array>) hoạt động tốt cho các mảng nguyên thủy. - Marcus
@ Hengameh Có một phương pháp dành riêng cho điều đó. System.out.println(String.join(" ", new String[]{"John", "Mahta", "Sara"})) sẽ in John Mahta Sara. - dorukayhan


Luôn kiểm tra các thư viện chuẩn trước. Thử:

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

hoặc nếu mảng của bạn chứa các mảng khác làm thành phần:

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

305
2018-05-12 21:01



Điều gì sẽ xảy ra nếu chúng ta có một chuỗi các chuỗi, và muốn đầu ra đơn giản; như: String[] array = {"John", "Mahta", "Sara"}và chúng tôi muốn đầu ra này không có dấu ngoặc và dấu phẩy: John Mahta Sara? - Hengameh
@Hengameh Chỉ lưu trữ mảng Arrays.toString (mảng) vào một biến chuỗi và sau đó loại bỏ các dấu ngoặc bằng cách thay thế phương thức của Java - Naveed Ahmad
@Hengameh Ngày nay với Java 8: String.join(" ", Arrays.asList(array)). doc - Justin


Điều này là tốt đẹp để biết, tuy nhiên, như đối với "luôn luôn kiểm tra các thư viện chuẩn đầu tiên" Tôi chưa bao giờ có stumbled khi các trick của Arrays.toString( myarray )

- kể từ khi tôi đang tập trung vào loại của myarray để xem làm thế nào để làm điều này. Tôi không muốn phải lặp lại thông qua điều này: Tôi muốn có một cuộc gọi dễ dàng để làm cho nó đi ra tương tự như những gì tôi thấy trong trình gỡ lỗi Eclipse và myarray.toString () không thực hiện nó.

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

85
2018-02-06 23:35



Điều gì sẽ xảy ra nếu chúng ta có một chuỗi các chuỗi, và muốn đầu ra đơn giản; như: String[] array = {"John", "Mahta", "Sara"}và chúng tôi muốn đầu ra này không có dấu ngoặc và dấu phẩy: John Mahta Sara? - Hengameh
@Hengameh Tôi nghĩ đó là một chủ đề khác. Bạn có thể thao tác chuỗi này với các hoạt động chuỗi phổ biến sau đó ... Giống như Arrays.toString (myarray) .replace ("[", "("), v.v. - OddDev


Trong JDK1.8 bạn có thể sử dụng các phép toán tổng hợp và một biểu thức 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



Hoặc ít cồng kềnh hơn, Arrays.stream(strArray).forEach(System.out::println); - Alexis C.
Đây là vụng về. Nó phải là System.out::println là tham chiếu phương thức Java 8. Bạn mã tạo ra một lambda không cần thiết. - Boris the Spider
Chỉ cần bỏ qua Arrays.asList và làm Arrays.stream(strArray).forEach(System.out::println) - Justin
@AlexisC. Bởi vì nó cũng có thể được sử dụng với các đối tượng khác hơn là mảng. - Yassin Hajaj
@YassinHajaj Cả hai. Ví dụ: nếu bạn muốn có một luồng phạm vi trên mảng theo cách thành ngữ sử dụng Stream.of sẽ làm .skip(n).limit(m). Triển khai hiện tại không trả lại luồng SIZED trong khi Arrays.stream(T[], int, int) không, dẫn đến các buổi biểu diễn chia nhỏ tốt hơn nếu bạn muốn thực hiện các thao tác song song. Ngoài ra nếu bạn có một int[], bạn có thể vô tình sử dụng Stream.of sẽ trả về Stream<int[]> với một phần tử duy nhất, trong khi Arrays.stream sẽ cung cấp cho bạn một IntStream trực tiếp. - Alexis C.


Nếu bạn đang sử dụng Java 1.4, bạn có thể thay thế:

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

(Điều này cũng hoạt động trong 1,5+, dĩ nhiên.)


37
2017-12-23 18:51



Thật không may, điều này chỉ làm việc với các mảng của các đối tượng, không phải mảng của nguyên thủy. - Alex Spurling


Bắt đầu với Java 8, người ta cũng có thể tận dụng lợi thế của join() phương pháp do Lớp chuỗi để in ra các phần tử mảng, không có dấu ngoặc và được phân tách bằng dấu phân tách lựa chọn (là ký tự khoảng trắng cho ví dụ được hiển thị bên dưới):

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

Đầu ra sẽ là "Hey there amigo!".


35
2017-10-05 19:13





Arrays.deepToString(arr) chỉ in trên một dòng.

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

Để thực sự có được một bảng để in như một bảng hai chiều, tôi phải làm điều này:

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

Nó có vẻ như Arrays.deepToString(arr) phương pháp nên có một chuỗi phân cách, nhưng tiếc là nó không.


27
2018-03-11 05:36



Có thể sử dụng System.getProperty ("line.separator"); thay vì \ r \ n vì vậy nó cũng phù hợp với cả Windows. - Scooter
bạn có thể sử dụng System.lineSeparator () ngay bây giờ - Novaterata


Arrays.toString

Như một câu trả lời trực tiếp, giải pháp được cung cấp bởi một số, bao gồm cả @Esko, sử dụng Arrays.toString và Arrays.deepToString phương pháp, đơn giản là tốt nhất.

Java 8 - Stream.collect (tham gia ()), Stream.forEach

Dưới đây tôi cố gắng liệt kê một số phương pháp khác được đề xuất, cố gắng cải thiện một chút, với sự bổ sung đáng chú ý nhất là việc sử dụng Stream.collect toán tử, sử dụng joining  Collector, để bắt chước những gì String.join đang làm.

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





Trước Java 8, chúng tôi có thể đã sử dụng Arrays.toString(array) để in mảng một chiều và Arrays.deepToString(array) cho mảng đa chiều. Chúng tôi đã có tùy chọn Stream và lambda trong Java 8 cũng có thể được sử dụng để in mảng.

In một chiều Mảng:

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

Đầu ra là:

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

In mảng đa chiều Chỉ trong trường hợp chúng ta muốn in mảng đa chiều, chúng ta có thể sử dụng Arrays.deepToString(array) như:

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

Bây giờ, điểm quan sát là phương pháp Arrays.stream(T[]), trong trường hợp int[] trả lại cho chúng tôi Stream<int[]> và sau đó là phương pháp flatMapToInt() ánh xạ từng phần tử của luồng với nội dung của luồng được ánh xạ được tạo ra bằng cách áp dụng hàm ánh xạ được cung cấp cho mỗi phần tử.

Đầu ra là:

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


23
2018-01-24 04:25



Điều gì sẽ xảy ra nếu chúng ta có một chuỗi các chuỗi, và muốn đầu ra đơn giản; như: String[] array = {"John", "Mahta", "Sara"}và chúng tôi muốn đầu ra này không có dấu ngoặc và dấu phẩy: John Mahta Sara? - Hengameh


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

17
2017-08-07 14:05



Bằng cách này bạn kết thúc với một không gian trống rỗng;) - Matthias
@ matthiad .. dòng này sẽ tránh kết thúc với không gian trống System.out.println (n + (someArray.length == n)? "": ""); - Muhammad Suleman
Cách làm tồi tệ nhất. - NameNotFoundException
Điều này là rất kém hiệu quả nhưng tốt cho người mới bắt đầu. - Raymo111
@ MuhammadSuleman Điều đó không hiệu quả, bởi vì đây là một vòng lặp cho mỗi. n là giá trị thực tế từ mảng, không phải chỉ mục. Đối với một vòng lặp thường xuyên, nó cũng sẽ được (someArray.length - 1) == i, bởi vì nó phá vỡ khi i bằng với chiều dài mảng. - Radiodef