Вместо переменных massive1, ..., massive6
длина переменной List massives
будет более подходящей:
List<List<Integer>> massives = Arrays.stream(str.split("\\R")) // Stream<String>
.map(line -> Arrays.stream(line.split("\t")) // Stream<String>
.map(field -> Integer::valueOf) // Stream<Integer>
.collect(Collectors.toList())) // List<Integer>
.collect(Collectors.toList()); // List<List<Integer>>
List<int[]> massives = Arrays.stream(str.split("\\R"))
.map(line -> Arrays.stream(line.split("\t"))
.mapToInt(Integer::parseInt)
.toArray())
.collect(Collectors.toList());
Может быть с:
massive1 = massives.get(0);
massive2 = massives.get(1);
massive3 = massives.get(2);
massive4 = massives.get(3);
...
Пояснение:
String[] String#split(String regex)
будет разделен с использованием соответствия разрыва строки (\\R
) на несколько строк.
Stream.of
/ Arrays.stream
превращает String[]
в Stream<String>
своего рода итерацию через каждую строку.
Stream.map
превращает каждую строку при использовании Integer :: valueOf в целое число.
Stream.collect
собирает каждое целое число в список.
Потоки очень выразительны, но могут не подходить для начинающих, так как объединяют все в одно выражение, что может легко вызвать ошибки.
После понимания вопроса:
int[][] rows = Stream.of(str.split("\\R"))
.map(line -> Stream.of(line.split("\\s+"))
.mapToInt(Integer.parseInt)
.toArray())
.toArray(int[][]::new);
Как ни крути столбцы:
int m = rows.length;
int n = Arrays.stream(rows).mapToInt(line -> line.length).min().orElse(0);
int[][] columns = IntStream.range(0, n)
.mapToObj(j -> IntStream.range(0, m)
.map(i -> rows[i][j])
.toArray()).toArray(int[][]::new);
System.out.println(Arrays.deepToString(columns));
На самом деле я советую преобразовывать строки в столбцы с помощью классических циклов for;
намного лучше читается.
Но ответ StackOverflow не обязательно должен выбирать самый простой способ.