log - printarray java




打印Java數組最簡單的方法是什麼? (18)

在Java中,數組不會覆蓋toString() ,因此如果您嘗試直接打印一個數據,您將獲得由Object.toString()定義的數組hashCode的className + @ +十六進制數:

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

但通常我們實際上需要更多的東西,如[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]

Arrays.toString

作為直接的答案,使用Arrays.toStringArrays.deepToString方法的幾個解決方案(包括@Esko)的解決方案是最好的。

Java 8 - Stream.collect(加入()),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);

For-each循環也可以用於打印數組的元素:

int array[] = {1, 2, 3, 4, 5};
for (int i:array)
    System.out.println(i);

在Java中打印數組的不同方式:

  1. 簡單的方法

    List<String> list = new ArrayList<String>();
    list.add("One");
    list.add("Two");
    list.add("Three");
    list.add("Four");
    // Print the list in console
    System.out.println(list);
    

輸出:[一,二,三,四]

  1. 使用toString()

    String[] array = new String[] { "One", "Two", "Three", "Four" };
    System.out.println(Arrays.toString(array));
    

輸出:[一,二,三,四]

  1. 打印數組陣列

    String[] arr1 = new String[] { "Fifth", "Sixth" };
    String[] arr2 = new String[] { "Seventh", "Eight" };
    String[][] arrayOfArray = new String[][] { arr1, arr2 };
    System.out.println(arrayOfArray);
    System.out.println(Arrays.toString(arrayOfArray));
    System.out.println(Arrays.deepToString(arrayOfArray));
    

輸出:[[Ljava.lang.String; @ 1ad086a [[Ljava.lang.String; @ 10385c1,[Ljava.lang.String; @ 42719c] [[Fifth,Sixth],[Seventh,Eight]]

資源: 訪問數組


有以下方法來打印數組

 // 1) toString()  
    int[] arrayInt = new int[] {10, 20, 30, 40, 50};  
    System.out.println(Arrays.toString(arrayInt));

// 2 for loop()
    for (int number : arrayInt) {
        System.out.println(number);
    }

// 3 for each()
    for(Integer lists : arrayInt){
         System.out.println(lists);
     }

使用org.apache.commons.lang3.StringUtils.join(*)方法可以是一個選項
例如:

String[] strArray = new String[] { "John", "Mary", "Bob" };
String arrayAsCSV = StringUtils.join(strArray, " , ");
System.out.printf("[%s]", arrayAsCSV);
//output: [John , Mary , Bob]

我使用了以下依賴項

<groupId>org.apache.commons</groupId>
<artifactId>commons-lang3</artifactId>
<version>3.3.2</version>

在JDK1.8中,您可以使用聚合操作和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
*/

在java 8中很容易。 有兩個關鍵字

  1. stream: Arrays.stream(intArray).forEach
  2. 方法參考::println

    int[] intArray = new int[] {1, 2, 3, 4, 5};
    Arrays.stream(intArray).forEach(System.out::println);
    

如果要在同一行中print數組中的所有元素,則只需使用print而不是println

int[] intArray = new int[] {1, 2, 3, 4, 5};
Arrays.stream(intArray).forEach(System.out::print);

沒有方法參考的另一種方法是使用:

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

在java 8中:

Arrays.stream(myArray).forEach(element-> System.out.println(element));

如果您使用的是Java 1.4,則可以改為:

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

(當然,這個工作在1.5+以上。)


如果數組的類型為char [],還有一種方法:

char A[] = {'a', 'b', 'c'}; 

System.out.println(A); // no other arguments

版畫

abc

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

從Java 8開始,還可以利用String類提供的join()方法來打印出不帶括號的數組元素,並用選擇的分隔符分隔(這是下面示例的空格字符) :

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

輸出結果將是“嘿,好歹!”。


我最近在Vanilla #Java遇到過這篇文章。 寫Arrays.toString(arr);不是很方便Arrays.toString(arr); ,然後導入java.util.Arrays; 每時每刻。

請注意,這不是一個永久性的解決辦法。 只是一個可以使調試更簡單的黑客。

直接打印數組給出了內部表示和hashCode。 現在,所有的類都有Object作為父類型。 那麼,為什麼不破解Object.toString() ? 沒有修改,Object類看起來像這樣:

public String toString() {
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

如果這被改為:

public String toString() {
    if (this instanceof boolean[])
        return Arrays.toString((boolean[]) this);
    if (this instanceof byte[])
        return Arrays.toString((byte[]) this);
    if (this instanceof short[])
        return Arrays.toString((short[]) this);
    if (this instanceof char[])
        return Arrays.toString((char[]) this);
    if (this instanceof int[])
        return Arrays.toString((int[]) this);
    if (this instanceof long[])
        return Arrays.toString((long[]) this);
    if (this instanceof float[])
        return Arrays.toString((float[]) this);
    if (this instanceof double[])
        return Arrays.toString((double[]) this);
    if (this instanceof Object[])
        return Arrays.deepToString((Object[]) this);
    return getClass().getName() + "@" + Integer.toHexString(hashCode());
}

通過將以下內容添加到命令行中,可以將此修飾的類簡單地添加到類路徑中: -Xbootclasspath/p:target/classes

現在,隨著自Java 5以來的deepToString(..)的可用性, toString(..)可以很容易地更改為deepToString(..)來添加對包含其他數組的數組的支持。

我發現這是一個非常有用的黑客攻擊,如果Java可以簡單地添加它,那將會很棒。 我了解具有非常大的數組的潛在問題,因為字符串表示可能有問題。 可能會傳遞像System.outPrintWriter這樣的事情。


我試過的簡化快捷鍵是這樣的:

    int x[] = {1,2,3};
    String printableText = Arrays.toString(x).replaceAll("[\\[\\]]", "").replaceAll(", ", "\n");
    System.out.println(printableText);

它會打印

1
2
3

這種方法不需要循環,只適用於小型陣列


然而,對於“總是首先檢查標準庫”我很高興知道,我從來沒有偶然發現過Arrays.toString( myarray )

- 因為我正在專注於這種類型的myarray,看看如何做到這一點。 我不想迭代這個事情:我想要一個簡單的調用使它出現類似於我在Eclipse調試器中看到的內容,而myarray.toString()就是沒有這樣做。

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

要添加所有答案,將對像作為JSON字符串打印也是一種選擇。

使用傑克遜:

ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter();
System.out.println(ow.writeValueAsString(anyArray));

使用Gson:

Gson gson = new Gson();
System.out.println(gson.toJson(anyArray));

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

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

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

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

output: [John, Mary, Bob]

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






printing