[英]java create 2D array from Stream<Integer>
我有Stream Stream<Integer> stream
// 1,2,3,4,5,6,7,8,9
我需要從這個stream
創建int[3][3]
我該怎么做?
我試過了
int[][] ints = stream
.map(i -> new int[]{i})
.toArray(int[][]::new);
但我得到: [[1], [2], [3], [4], [5], [6], [7], [8], [9]]
但我需要: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]
編輯:我認為這不是dublicate 這是因為我需要int [3] [3]數組而不是String [] []
我試過這個例子
int[][] array =
IntStream.range(0, 3)
.mapToObj(x -> IntStream.range(0, 3).boxed()
.toArray(Integer[]::new))
.toArray(int[][]::new);
我得到錯誤
Exception in thread "main" java.lang.ArrayStoreException: [Ljava.lang.Integer;
at java.util.stream.Nodes$FixedNodeBuilder.accept(Nodes.java:1222)
at java.util.stream.IntPipeline$4$1.accept(IntPipeline.java:250)
at java.util.stream.Streams$RangeIntSpliterator.forEachRemaining(Streams.java:110)
at java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:693)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:545)
at java.util.stream.AbstractPipeline.evaluateToArrayNode(AbstractPipeline.java:260)
at java.util.stream.ReferencePipeline.toArray(ReferencePipeline.java:438)
at SparseMatrixSupportImpl.fromStream(SparseMatrixSupportImpl.java:25)
at SparseMatrixSupportImpl.fromStream(SparseMatrixSupportImpl.java:4)
at Main.main(Main.java:12)
編輯:
int[][] array = stream.collect(() -> new int[3][3],
(a, i) -> a[(i - 1) / 3][(i - 1) % 3] = i, (a, i) -> {
});
錯誤
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 3
at SparseMatrixSupportImpl.lambda$fromStream$1(SparseMatrixSupportImpl.java:28)
at java.util.stream.ReduceOps$4ReducingSink.accept(ReduceOps.java:220)
at java.util.stream.IntPipeline$4$1.accept(IntPipeline.java:250)
at java.util.Spliterators$IntArraySpliterator.forEachRemaining(Spliterators.java:1032)
at java.util.Spliterator$OfInt.forEachRemaining(Spliterator.java:693)
at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:481)
at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
at java.util.stream.ReduceOps$ReduceOp.evaluateSequential(ReduceOps.java:708)
at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
at java.util.stream.ReferencePipeline.collect(ReferencePipeline.java:510)
at SparseMatrixSupportImpl.fromStream(SparseMatrixSupportImpl.java:27)
at SparseMatrixSupportImpl.fromStream(SparseMatrixSupportImpl.java:4)
at Main.main(Main.java:12)
int[] values = new int[]{1, 2, 3,5,6,7,8,9,11};
Stream<Integer> integerStream = Arrays.stream(values).boxed();
您可以使用Java 9嘗試此代碼(這會在Java 8中引發編譯錯誤,因此請注意):
int[][] array = Stream.iterate(1, i -> i < 10, i -> i + 1).collect(() -> new int[3][3],
(a, i) -> a[(i - 1) / 3][(i - 1) % 3] = i, (a, i) -> {});
Stream.of(array).forEach(a -> System.out.println(Arrays.toString(a)));
結果如下:
[1, 2, 3]
[4, 5, 6]
[7, 8, 9]
使用Java 8:
int[][] array = IntStream.range(1, 10).collect(() -> new int[3][3],
(a, i) -> a[(i - 1) / 3][(i - 1) % 3] = i, (a, i) -> {});
Stream.of(array).forEach(a -> System.out.println(Arrays.toString(a)));
這是另一種支持除預定義序列(1,2,3,4,5,6,7,8,9)以外的數字的解決方案,但它不是一個干凈的解決方案,因為它使用了一個計數器數組:
int[] counter = {0};
int[][] array = Stream.of(4, 2, 3, 4, 5, 8, 9, 8, 11).collect(() -> new int[3][3],
(a, i) -> {
a[counter[0] / 3][counter[0] % 3] = i;
counter[0]++;
}, (a, i) -> {});
輸出:
[4, 2, 3]
[4, 5, 8]
[9, 8, 11]
如果您想要基於上述解決方案的更通用的解決方案,您可以嘗試此代碼片段,它允許設置可變數量的列:
List<Integer> list = Arrays.asList(4, 2, 3, 4, 5, 8, 9, 8, 11, 12, 13, 17, 32, 45, 89, 91, 91, 98, 87);
int[] counter = {0};
int cols = 5;
int rows = (int) Math.ceil(list.size() / cols) + 1;
int[][] array = list.stream().collect(() -> new int[rows][cols],
(a, i) -> a[counter[0] / cols][counter[0]++ % cols] = i, (a, i) -> {});
Stream.of(array).forEach(a -> System.out.println(Arrays.toString(a)));
上面的代碼段打印:
[4, 2, 3, 4, 5]
[8, 9, 8, 11, 12]
[13, 17, 32, 45, 89]
[91, 91, 98, 87, 0]
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.