Java stream двумерный массив

Двумерный массив символов из строки с использованием Stream

Таким образом, массив будет иллюстрировать эту матрицу:

Но как я могу сделать это с помощью Java 8 Streams, потому что я не хочу делать это с помощью случайных циклов?

2 ответа

Плохие петли. У них такая плохая репутация. Я сомневаюсь, что решение на основе потоков было бы таким ясным:

int n = alphabet.length(); char[][] cs = new char[n][n]; for (int i = 0; i < n; ++i) < for (int j = 0; j < n; ++j) < cs[i][j] = alphabet.charAt((i + j) % n); >> 

Если бы мне пришлось делать это с потоками, я бы сделал что-то вроде этого:

IntStream.range(0, n) .forEach( i -> IntStream.range(0, n).forEach(j -> cs[i][j] = alphabet.charAt((i + j) % n))); 

Или, если я не заботился о создании множества промежуточных строк:

cs = IntStream.range(0, n) .mapToObj(i -> alphabet.substring(i) + alphabet.substring(0, i)) .map(String.toCharArray()) .toArray(new char[n][]); 

Чуть более интересный способ сделать это:

char[][] cs = new char[n][]; cs[0] = alphabet.toCharArray(); for (int i = 1; i

Вы можете использовать Stream.iterate() для постепенного вращения каждой строки, а затем преобразовать их в массивы char :

chars = Stream.iterate(alphabet, str -> str.substring(1) + str.charAt(0)) .limit(alphabet.length()) .map(String::toCharArray) .toArray(char[][]::new); 

Или вы можете повернуть каждую строку по ее индексу с помощью Apache StringUtils.rotate() :

chars = IntStream.range(0, alphabet.length()) .mapToObj(i -> StringUtils.rotate(alphabet, -i)) .map(String::toCharArray) .toArray(char[][]::new); 

Или с помощью > служебный класс:

chars = Stream.generate(alphabet::toCharArray) .limit(alphabet.length()) .toArray(char[][]::new); IntStream.range(0, chars.length) .forEach(i -> Collections.rotate(Chars.asList(chars[i]), -i)); 

Источник

Как создать двумерный массив из потока в Java 8?

Я хочу прочитать этот файл и загрузить его в виде двухмерного массива. Я ожидаю получить массив, подобный приведенному ниже:

File idsFile = . ; try (Stream idsStream = Files.lines(idsFile.toPath(), StandardCharsets.US_ASCII)) < Object[][] ids = idsStream .filter(s ->s.trim().length() > 0) .toArray(size -> new Object[size][]); // Process ids array here. > 
java.lang.ArrayStoreException: null at java.lang.System.arraycopy(Native Method) ~[na:1.8.0_45] at java.util.stream.SpinedBuffer.copyInto(Unknown Source) ~[na:1.8.0_45] at java.util.stream.Nodes$SpinedNodeBuilder.copyInto(Unknown Source) ~[na:1.8.0_45] at java.util.stream.SpinedBuffer.asArray(Unknown Source) ~[na:1.8.0_45] at java.util.stream.Nodes$SpinedNodeBuilder.asArray(Unknown Source) ~[na:1.8.0_45] at java.util.stream.ReferencePipeline.toArray(Unknown Source) ~[na:1.8.0_45] . 

Почему new Integer(1000) ? И вам нужен [][] , где во внутреннем массиве всегда есть length == 1 ? — person Boris the Spider &nbsp schedule 13.06.2015

Читайте также:  Python char to ascii code

@BoristheSpider Идентификаторы передаются сторонней библиотеке, которая принимает только Object[][] в качестве входных данных. — person Stephan &nbsp schedule 13.06.2015

Ответы (2)

 strings .filter(s -> s.trim().length() > 0) .map(Integer::parseInt) .map(i -> new Object[]) 
Object[][] result = strings .filter(s -> s.trim().length() > 0) .map(Integer::parseInt) .map(i -> new Object[]) .toArray(Object[][]::new); 
final Stream strings = Stream.of("1000", "999", "745", "123"); 

Если вы подозреваете, что строки могут иногда иметь пробелы до и после, то лучше добавить отдельный шаг trim : strings.map(String::trim).filter(s -> !s.isEmpty()) . Также я бы использовал Integer::valueOf вместо Integer::parseInt , поскольку он лучше соответствует желаемому типу ( Integer , а не int ). Хотя, наверное, дело вкуса. — person Tagir Valeev; 13.06.2015

@Stephan: таким образом вы можете анализировать файлы, в которых есть пробелы после чисел (например, «1 \n2\n3 \n» ). В настоящее время у вас будет NumberFormatException в таких файлах. — person Tagir Valeev; 13.06.2015

Как вы думаете, есть ли польза в этих двух map операциях вместо того, чтобы просто сказать .map(s -> new Object[]) ? — person Holger; 15.06.2015

@ Холгер, правда, не знаю. Мне нравится разделять каждое логическое преобразование на отдельный map шаг — я думаю, что это делает код более читаемым. Я полагаю, это просто вопрос личных предпочтений — я сомневаюсь, что это сильно повлияет на производительность. — person Boris the Spider; 15.06.2015

Ваша последняя строка, вероятно, должна быть size -> new Object[size] , но вам нужно будет предоставить массивы целых чисел размера один, и вам также нужно будет проанализировать строки на целые числа. Предлагаю следующее:

try (Stream idsStream = Files.lines(idsFile.toPath(), StandardCharsets.US_ASCII)) < Object[][] ids = idsStream .map(String::trim) .filter(s ->!s.isEmpty()) .map(Integer::valueOf) .map(i -> new Integer[] < i >) .toArray(Object[][]::new); // Process ids array here. > 

Источник

Читайте также:  Java compile only one class

Java создать двумерный массив из потока

Но я получаю: [[1], [2], [3], [4], [5], [6], [7], [8], [9]] Но мне нужно: [[1, 2, 3], [4, 5, 6], [7, 8, 9]] EDIT: я думаю, что это не dublicate this, потому что мне нужен массив 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[]; Stream integerStream = Arrays.stream(values).boxed(); 

Источник

Двумерные массивы в Java

Вы уже знаете что такое массивы в Java и как с ними работать?

1. Если ответ «нет» — прочтите сначала статью «Массивы в Java»

2. Если ответ «да» — читайте статью ниже о двумерных массивах.

Поскольку Вы уже знаете что такое массивы и как с ними работать, наверняка, для Вас не проблема:

Например:
Ну, а что же с двумерным массивом?

Самый, наверное, распространенный пример двумерного массива — это матрица. Если кто забыл что такое матрица, напоминаем:

array_vertex-academy-2

В матрице есть строки и столбцы . На пересечении их стоит определенное значение.

array_vertex-academy-3

Напоминаем, что счет в массивах начинается с 0 .

Читайте также:  Java stop waiting thread

— число 1 это пересечение 0 — строки и 0 — столбца
— число 2 это пересечение 0 — строки и 1 — столбца
— число 3 это пересечение 1 — строки и 0 — столбца
— число 4 это пересечение 1 — строки и 1 — столбца

Ниже приводим пример объявления двумерного массива на языке программирования Java:

Или можно сразу объявить содержимое массива:

При инициализации двумерного массива, можно заметить отличие от обычного массива. В двумерном массиве Вы используете две квадратные скобки вместо одной.

  • в первой вы пишите количество строк
  • во второй вы пишите количество столбцов

При заполнении двумерного массива Вы указываете в этих скобках строку и столбец.

Например
А как же вывести двумерный массив в консоль?

Вывод двумерного массива с помощью цикла for сильно отличается от вывода обычного массива (когда используется цикл for).

Чтобы вывести в каждую ячейку двумерного массива значение, не достаточно использовать один цикл for. Необходимо использовать два цикла for, при этом один из них находится в другом.

Почему так?

Ранее упоминалось, что двумерный массив состоит из строк и столбцов. Каждая ячейка такого массива — это пересечение какой-то строки и столбца.

1. Так что первый цикл for перебирает каждую строку двумерного массива (которая содержит какое-то количество столбцов).

2. А второй цикл for перебирает столбцы в этой строке. Таким образом можно заполнить значением каждый элемент двумерного массива.

Например:

Если Вы запустите данный код на своем компьютере, в консоли Вы увидите:

Надеемся, что наша статья была Вам полезна. Также есть возможность записаться на наши курсы по Java в Киеве. Обучаем с нуля. Детальную информацию Вы можете найти у нас на сайте.

Источник

Оцените статью