打印java数组的最简单方法是什么?

cngwdvgl  于 2021-08-25  发布在  Java
关注(0)|答案(30)|浏览(360)

在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]
jfewjypa

jfewjypa16#

因为Java5可以使用 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[] 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[] intArray = { 7, 9, 5, 1, 3 };
System.out.println(Arrays.toString(intArray));

输出:

[7, 9, 5, 1, 3 ]
0x6upsns

0x6upsns17#

在Java8中,这很容易。有两个关键词
流: Arrays.stream(intArray).forEach 方法参考: ::println ```
int[] intArray = new int[] {1, 2, 3, 4, 5};
Arrays.stream(intArray).forEach(System.out::println);

如果要在同一行中打印数组中的所有元素,只需使用 `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));

e4yzc0pl

e4yzc0pl18#

我最近在vanilla#java上看到了这篇文章。写起来不太方便 Arrays.toString(arr); ,然后导入 java.util.Arrays; 总是
请注意,这并不是一个永久性的修复方法。这只是一个可以简化调试的技巧。
直接打印数组会给出内部表示和哈希代码。现在,所有的班级都有 Object 作为父类型。那么,为什么不破解这个程序呢 Object.toString() ? 未经修改,对象类如下所示:

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 .
现在,随着 deepToString(..) 自Java5以来 toString(..) 可以很容易地更改为 deepToString(..) 添加对包含其他阵列的阵列的支持。
我发现这是一个非常有用的hack,如果java能够简单地添加它,那就太好了。我理解使用非常大的数组的潜在问题,因为字符串表示可能有问题。也许会传一些像 System.out 或者 PrintWriter 对于这种可能性。

3mpgtkmj

3mpgtkmj19#

无论您使用哪个jdk版本,它都应始终有效:

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

如果 Array 包含对象。如果 Array 包含基元类型,您可以使用 Package 器类而不是将基元直接存储为。。
例子:

int[] a = new int[]{1,2,3,4,5};

替换为:

Integer[] a = new Integer[]{1,2,3,4,5};

更新:
对值得一提的是,将数组转换为对象数组或使用对象数组的成本很高,可能会降低执行速度。这是java的特性,称为自动装箱。
因此,仅用于打印目的,不应使用。我们可以制作一个函数,该函数以数组为参数,并将所需格式打印为

public void printArray(int [] a){
        //write printing code
}
e0bqpujr

e0bqpujr20#

在我看来,使用正则for循环是打印数组最简单的方法。这里有一个基于intarray的示例代码

for (int i = 0; i < intArray.length; i++) {
   System.out.print(intArray[i] + ", ");
}

它将输出为您的1、2、3、4、5

dw1jzc5e

dw1jzc5e21#

在java中打印数组的不同方法:
简单方法

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

输出:[一,二,三,四]
使用 toString() ```
String[] array = new String[] { "One", "Two", "Three", "Four" };
System.out.println(Arrays.toString(array));

输出:[一,二,三,四]
打印阵列的阵列

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][[第五、第六、[第七、第八]]
资源:访问一个数组
jum4pzuy

jum4pzuy22#

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

6vl6ewon23#

Arrays.deepToString(arr) 只在一行上打印。

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

要将表格打印为二维表格,我必须执行以下操作:

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

看起来像是 Arrays.deepToString(arr) 方法应该使用分隔符字符串,但不幸的是它没有。

1aaf6o9v

1aaf6o9v24#

数组.tostring

作为一个直接的回答,包括@esko在内的几个公司提供的解决方案使用 Arrays.toStringArrays.deepToString 方法,就是最好的。

Java8-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);
6ljaweal

6ljaweal25#

如果您使用的是java 1.4,则可以执行以下操作:

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

(当然,这也适用于1.5+版本。)

bhmjp9jg

bhmjp9jg26#

Java8之前的版本

我们本可以用 Arrays.toString(array) 打印一维数组和 Arrays.deepToString(array) 对于多维数组。

java 8

现在我们可以选择 Streamlambda 打印数组。
打印一维数组:

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.
厕所
玛丽
上下快速移动
打印多维数组以防我们想要打印我们可以使用的多维数组 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() 将流的每个元素与通过将提供的Map函数应用于每个元素而生成的Map流的内容进行Map。
输出为:
[[11, 12], [21, 22], [31, 32, 33]]
[约翰,好极了],[玛丽,李],[鲍勃,Json]]
11
12
21
22
31
32
33
厕所
好极了
玛丽

上下快速移动
Json

to94eoyn

to94eoyn27#

从Java8开始,还可以利用 join() string类提供的用于打印数组元素的方法,该方法不带括号,并由所选分隔符(以下示例中的空格字符)分隔:

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

输出将是“嗨,朋友!”。

ws51t4hk

ws51t4hk28#

在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

* /
uurv41yg

uurv41yg29#

然而,知道这一点很好,至于“总是先检查标准库”,我从来没有偶然发现 Arrays.toString( myarray ) --因为我专注于myarray的类型,想看看如何做到这一点。我不想重复这件事:我想要一个简单的调用,使它与我在eclipse调试器和myarray中看到的类似。tostring()只是没有这样做。

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

bvuwiixz30#

始终首先检查标准库。

import java.util.Arrays;

然后尝试:

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

或者,如果您的数组包含其他数组作为元素:

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

相关问题