2017-11-02 98 views
5

Akış den 2D dizi oluşturmak Bu stream java Ben Akış var

den int[3][3] oluşturmak gerek Stream<Integer> stream // 1,2,3,4,5,6,7,8,9

Nasıl Yaptım?

Ben

int[][] ints = stream 
      .map(i -> new int[]{i}) 
      .toArray(int[][]::new); 

çalıştı Ama olsun: [[1], [2], [3], [4], [5], [6], [7], [8], [9]]

Ama gerekir: [[1, 2, 3], [4, 5, 6], [7, 8, 9]]

EDIT: Ben int gerek çünkü this Dublicate olmadığını düşünüyorum [3] [3] dizi ve değil [] []

Bu örneği denedim

int[][] array = 
      IntStream.range(0, 3) 
       .mapToObj(x -> IntStream.range(0, 3).boxed() 
        .toArray(Integer[]::new)) 
       .toArray(int[][]::new); 

Ve olsun hata

DÜZENLEME
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) -> { 
      }); 

hata Sen Java 9 ile bu kodu deneyebilirsiniz

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(); 
+1

Olası yinelenen (https://stackoverflow.com/questions/26050530/filling-a-multidimensional-array-using-a-strea m) –

+3

@AntonBalaniuc Akış zaten mevcutsa çalışmayabilir, ör. bazı kaynaklardan geliyor OP değiştiremiyor. –

cevap

4

(bu Java 8'de bir derleme hatası atar , dikkat edin:

Java 8 ile

[1, 2, 3] 
[4, 5, 6] 
[7, 8, 9] 

: Burada

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

önceden tanımlanmış dizisinden başka numaraları destekleyen başka bir çözüm (1,2,3,4 Burada
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))); 

0 sonucudur , 5,6,7,8,9), ancak bir çözelti halinde bu temiz değil, bir karşı dizisini kullanır:

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

Çıkış:

[4, 2, 3] 
[4, 5, 8] 
[9, 8, 11] 

Eğer sütun değişken sayısını ayarlamak için izin veren bu kod parçacığını deneyebilirsiniz Yukarıdaki çözüm dayalı jenerik çözüm biraz daha isterseniz:

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

baskılar yukarıdaki pasajı: [bir Sohbeti kullanarak boyutlu Dizisi Dolum] arasında

[4, 2, 3, 4, 5] 
[8, 9, 8, 11, 12] 
[13, 17, 32, 45, 89] 
[91, 91, 98, 87, 0] 
+0

"main" iş parçacığında özel durum java.lang.ArrayIndexOutOfOrunsException: 3 – ip696

+0

Düzenledim cevap ..... – ip696

+0

@ ip696: Evet, başka girişleri 1,2,3,4,5 dışında kullanırsanız, bunu alabilirsiniz , 6,7,8,9. Ancak yukarıdaki snippet'ler iyi çalışıyor. –