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

4xrmg8kj  于 2021-07-06  发布在  Java
关注(0)|答案(30)|浏览(479)

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

iaqfqrcu1#

因为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数组:

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

输出:

[7, 9, 5, 1, 3 ]
flvlnr44

flvlnr442#

要添加到所有答案中,还可以选择将对象打印为json字符串。
使用Jackson:

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

使用gson:

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

0pizxfdo3#

如果数组是char[]类型,还有一种方法:

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

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

印刷品

abc
kjthegm6

kjthegm64#

这被标记为用于打印字节[]的副本。注意:对于字节数组,可能有其他合适的方法。
如果它包含iso-8859-1字符,则可以将其打印为字符串。

String s = new String(bytes, StandardChars.ISO_8559);
System.out.println(s);
// to reverse
byte[] bytes2 = s.getBytes(StandardChars.ISO_8559);

或者如果它包含utf-8字符串

String s = new String(bytes, StandardChars.UTF_8);
System.out.println(s);
// to reverse
byte[] bytes2 = s.getBytes(StandardChars.UTF_8);

或者如果你想把它打印成十六进制。

String s = DatatypeConverter.printHexBinary(bytes);
System.out.println(s);
// to reverse
byte[] bytes2 = DatatypeConverter.parseHexBinary(s);

或者如果你想把它打印成base64。

String s = DatatypeConverter.printBase64Binary(bytes);
System.out.println(s);
// to reverse
byte[] bytes2 = DatatypeConverter.parseBase64Binary(s);

或者如果要打印有符号字节值的数组

String s = Arrays.toString(bytes);
System.out.println(s);
// to reverse
String[] split = s.substring(1, s.length() - 1).split(", ");
byte[] bytes2 = new byte[split.length];
for (int i = 0; i < bytes2.length; i++)
    bytes2[i] = Byte.parseByte(split[i]);

或者如果要打印一个无符号字节值数组

String s = Arrays.toString(
               IntStream.range(0, bytes.length).map(i -> bytes[i] & 0xFF).toArray());
System.out.println(s);
// to reverse
String[] split = s.substring(1, s.length() - 1).split(", ");
byte[] bytes2 = new byte[split.length];
for (int i = 0; i < bytes2.length; i++)
    bytes2[i] = (byte) Integer.parseInt(split[i]); // might need a range check.
y4ekin9u

y4ekin9u5#

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

7vux5j2d6#

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

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

为了把一张表打印成二维表,我必须这样做:

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

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

relj7zay

relj7zay7#

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

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

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

tzcvj98z

tzcvj98z8#

在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

* /
xkftehaa

xkftehaa9#

无论您使用哪个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
}
ehxuflar

ehxuflar10#

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

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

xkftehaa11#

如果使用commons.lang库,我们可以: ArrayUtils.toString(array) ```
int[] intArray = new int[] {1, 2, 3, 4, 5};
String[] strArray = new String[] {"John", "Mary", "Bob"};
ArrayUtils.toString(intArray);
ArrayUtils.toString(strArray);

输出:

{1,2,3,4,5}
{John,Mary,Bob}

k7fdbhmy

k7fdbhmy12#

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

qxgroojn

qxgroojn13#

如果您运行的是jdk8。

public static void print(int[] array) {
    StringJoiner joiner = new StringJoiner(",", "[", "]");
    Arrays.stream(array).forEach(element -> joiner.add(element + ""));
    System.out.println(joiner.toString());
}

int[] array = new int[]{7, 3, 5, 1, 3};
print(array);

输出:

[7,3,5,1,3]
jfewjypa

jfewjypa14#

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

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

它的输出是你的1,2,3,4,5

ecr0jaav

ecr0jaav15#

我最近在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());
}

只需将以下内容添加到命令行,即可将此moded类添加到类路径中: -Xbootclasspath/p:target/classes .
现在,随着 deepToString(..) 自Java5以来 toString(..) 可以很容易地更改为 deepToString(..) 添加对包含其他数组的数组的支持。
我发现这是一个非常有用的黑客,如果java能简单地添加这个,那就太好了。我理解使用非常大的数组的潜在问题,因为字符串表示可能有问题。也许会传一些像 System.out 或者 PrintWriter 对于这种不测事件。

相关问题