在我的程序中,我试图使用流打印排序的int数组。但是在使用普通流时出现错误输出。并且在使用int流时会打印正确的详细信息。
请参阅下面的核心代码片段以获取更多详细信息。
package com.test.sort.bubblesort;
import java.util.Arrays;
import java.util.stream.Collectors;
import java.util.stream.IntStream;
public class BubbleSortWithRecursion {
public static void bubbleSort(int[] arr, int n) {
if (n < 2) {
return;
}
int prevValue;
int nextValue;
for (int index = 0; index < n-1; index++) {
prevValue = arr[index];
nextValue = arr[index+1];
if (prevValue > nextValue) {
arr[index] = nextValue;
arr[index+1] = prevValue;
}
}
bubbleSort(arr, n-1);
}
public static void main(String[] args) {
int arr[] = new int[] {10,1,56,8,78,0,12};
bubbleSort(arr, arr.length);
**//False Output** : [I@776ec8df
String output = Arrays.asList(arr)
.stream()
.map(x -> String.valueOf(x))
.collect(Collectors.joining(","));
System.out.println(output);
//Correct Output : 0,1,8,10,12,56,78
String output2 = IntStream
.of(arr)
.boxed()
.map(x -> Integer.toString(x))
.collect(Collectors.joining(","));
System.out.println(output2);
}
}
我在控制台上得到以下输出:
[I@776ec8df
0,1,8,10,12,56,78
第一行输出是使用不正确的普通java流生成的。
为什么使用普通的JAVA流会得到虚假内容?我在这里想念什么吗?
答案 0 :(得分:8)
您可以像这样解决您的问题:
String output = Arrays.stream(arr)
.boxed()
.map(String::valueOf)
.collect(Collectors.joining(",")); // 0,1,8,10,12,56,78
说明发生了什么事:
使用Arrays.asList()
时,外观如下:
public static <T> List<T> asList(T... a) {
return new ArrayList<>(a);
}
使用了T
类型的varargs,在您的情况下,您将其用于int[]
对象,因此Arrays.asList()
将返回List
中的int[]
而不是整数流,因此您必须使用Arrays.stream
,它看起来像这样:
public static IntStream stream(int[] array) {
return stream(array, 0, array.length);
}
获取正确的数据。
答案 1 :(得分:7)
Arrays.asList(arr)
返回唯一元素为List<int[]>
的{{1}}。因此,流式传输arr
并将该单个元素映射到List
并使用String.valueOf(x)
进行收集将得到一个Collectors.joining(",")
,其值为该单个数组的String
,是您看到的输出。
toString()
从String output = Arrays.asList(arr) // List<int[]>
.stream() // Stream<int[]>
.map(x -> String.valueOf(x)) // Stream<String> having a single element - "[I@776ec8df"
.collect(Collectors.joining(",")); // "[I@776ec8df"
数组创建IntStream
时,会得到单个元素的流(int
值),因此可以将它们装箱,然后转换为{{ 1}} s,然后加入它们以获得所需的输出。
如果进行更改,则可以使第一个代码段生效:
int
收件人:
String
因为这种方式int arr[] = new int[] {10,1,56,8,78,0,12};
将产生一个Integer arr[] = new Integer[] {10,1,56,8,78,0,12};
,其中包含输入数组的所有元素。
答案 2 :(得分:0)
您可以做的更短:
String output = Arrays.stream(arr)
.mapToObj(String::valueOf)
.collect(Collectors.joining(","));
结果为0,1,8,10,12,56,78
首先创建一个IntStream
,然后得到一个Stream<String>
,它被收集到最后的String
。