打印Java数组最简单的方法是什么?
在Java中,数组不会覆盖toString()
,所以如果您尝试直接打印一个,会得到奇怪的输出,包括内存位置:
int[] intArray = new int[] {1, 2, 3, 4, 5}; System.out.println(intArray); // prints something like '[I@3343c8b3'
但通常我们实际上想要更多的东西像[1, 2, 3, 4, 5]
。 什么是最简单的方法呢? 以下是一些示例input和输出:
// 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]
从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]
嵌套arrays:
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
arrays:
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 ]
总是先检查标准库。 尝试:
System.out.println(Arrays.toString(array));
或者如果你的数组包含其他数组作为元素:
System.out.println(Arrays.deepToString(array));
然而,对于“总是首先检查标准库”,我很高兴知道,我从来没有偶然发现过Arrays.toString( myarray )
– 因为我正在专注于这种types的myarray,看看如何做到这一点。 我不想迭代这个事情:我想要一个简单的调用来使它出现类似于我在Eclipsedebugging器中看到的,myarray.toString()只是没有做到这一点。
import java.util.Arrays; . . . System.out.println( Arrays.toString( myarray ) );
在JDK1.8中,您可以使用聚合操作和lambdaexpression式:
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 1.4,则可以执行以下操作:
System.out.println(Arrays.asList(array));
(当然,这个也工作在1.5+以上)。
从Java 8开始,还可以利用String类提供的join()
方法来打印出没有方括号的数组元素,并用select的分隔符(这是下面示例中的空格字符) :
String[] greeting = {"Hey", "there", "amigo!"}; String delimiter = " "; String.join(delimiter, greeting)
输出结果将是“你好,好吗!”
Arrays.deepToString(arr)
只打印在一行上。
int[][] table = new int[2][2];
要真正得到一个表作为二维表打印,我必须这样做:
System.out.println(Arrays.deepToString(table).replaceAll("],", "]," + System.getProperty("line.separator")));
看起来像Arrays.deepToString(arr)
方法应该采取分隔符string,但不幸的是它不。
Arrays.toString
作为一个直接的答案,使用Arrays.toString
和Arrays.deepToString
方法的几个解决scheme(包括@Esko)是最好的解决scheme。
Java 8 – Stream.collect(join()),Stream.forEach
下面我尝试列举一些build议的其他方法,尝试改进一点,其中最显着的补充是使用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);
在Java 8之前,我们可以使用Arrays.toString(array)
来打印一维数组和Arrays.deepToString(array)
。 我们已经在Java 8中得到了Stream
和lambda
的选项,也可以用于打印数组。
打印一维arrays:
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]
[John,Mary,Bob]
1
2
3
4
五
约翰
玛丽
短发
打印multidimensional array为了防止打印multidimensional array,我们可以使用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()
将映射的每个元素与映射的内容通过将所提供的映射函数应用于每个元素而产生的stream。
输出是:
[[11,12],[21,22],[31,32,33]]
[[John,Bravo],[Mary,Lee],[Bob,Johnson]]
11
12
21
22
31
32
33
约翰
布拉沃
玛丽
背风处
短发
约翰逊
for(int n: someArray) { System.out.println(n+" "); }
在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));
输出:[一,二,三,四]
-
打印数组arrays
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]]
资源: 访问数组
在我看来,使用常规for循环是打印数组最简单的方法。 这里你有一个基于你的intArray的示例代码
for (int i = 0; i < intArray.length; i++) { System.out.print(intArray[i] + ", "); }
它输出为你的1,2,3,4,5
我最近在Vanilla #Java遇到过这个post。 写Arrays.toString(arr);
不是很方便Arrays.toString(arr);
,然后导入java.util.Arrays;
每时每刻。
请注意,这不是一个永久的解决办法。 只是一个可以使debugging更简单的黑客。
直接打印数组给出了内部表示和hashCode。 现在,所有的类都有Object
作为父types。 那么,为什么不破解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()); }
通过将以下内容添加到命令行中,可以简单地将此修饰的类添加到类path中: -Xbootclasspath/p:target/classes
。
现在,从Java 5开始,随着deepToString(..)
的可用性, toString(..)
可以很容易地变成deepToString(..)
来增加对包含其他数组的数组的支持。
我发现这是一个非常有用的黑客,如果Java可以简单地添加它,那将是非常好的。 由于string表示可能有问题,因此我了解具有非常大的数组的潜在问题。 可能会传递类似于System.out
或PrintWriter
, PrintWriter
这种情况。
它应该始终工作,无论您使用的任何JDK版本:
System.out.println(Arrays.asList(array));
如果Array
包含对象,它将工作。 如果Array
包含原始types,则可以使用包装类,直接将原始数据存储为..
例:
int[] a = new int[]{1,2,3,4,5};
将其replace为:
Integer[] a = new Integer[]{1,2,3,4,5};
更新:
是的! 这是要提到的是,将数组转换为对象数组或使用对象的数组是昂贵的,可能会减慢执行速度。 它发生在java的自称为autoboxing的性质。
所以只用于打印目的,不应该使用。 我们可以创build一个以数组为参数并打印所需格式的函数
public void printArray(int [] a){ //write printing code }
如果你的数组的types是char [],还有一种方法:
char A[] = {'a', 'b', 'c'}; System.out.println(A); // no other arguments
版画
abc
我试过的一个简化的快捷键是这样的:
int x[] = {1,2,3}; String printableText = Arrays.toString(x).replaceAll("[\\[\\]]", "").replaceAll(", ", "\n"); System.out.println(printableText);
它会打印
1 2 3
这种方法不需要循环,只适用于小数组
在Java 8中很容易。 有两个关键字
- stream:
Arrays.stream(intArray).forEach
-
方法的参考
::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));
要添加所有答案,将对象作为JSONstring打印也是一个选项。
使用jackson:
ObjectWriter ow = new ObjectMapper().writer().withDefaultPrettyPrinter(); System.out.println(ow.writeValueAsString(anyArray));
使用Gson:
Gson gson = new Gson(); System.out.println(gson.toJson(anyArray));
public class printer { public static void main(String[] args) { String a[] = new String[4]; Scanner sc = new Scanner(System.in); System.out.println("enter the data"); for (int i = 0; i < 4; i++) { a[i] = sc.nextLine(); } System.out.println("the entered data is"); for (String i : a) { System.out.println(i); } } }
你可以循环访问数组,打印出每个项目,就像循环一样。 例如:
String[] items = {"item 1", "item 2", "item 3"}; for(int i = 0; i < items.length; i++) { System.out.println(items[i]); }
输出:
item 1 item 2 item 3
使用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>
对于每个循环,也可以用来打印数组的元素:
int array[]={1,2,3,4,5}; for (int i:array) System.out.println(i);
有以下的方法来打印数组
// 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); }
打印数组最简单的方法是使用for循环:
// initialize array for(int i=0;i<10;i++) { System.out.print(array[i] + " "); }