Java строка разделить числа - PullRequest
0 голосов
/ 23 мая 2019

У меня есть несколько строк чисел в String str;
Числа, разделенные на TAB

1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
1 2 3 4 5 6
\\... many others, ~ 2 000 strings

Мне нужно разделить столбцы с

1 числами на массив1,
2числа в массивный2,
3 числа в массивный3,
4 числа в массивный4,
5 чисел в массивный5,
6 чисел в массивный6

Я знаю, как решить эту задачу со многимиfor / while, но мне нужно компактное решение для этой задачи.Может быть, мне нужно Patern.compile или String.split?

Часть моего кода:

for (i = 0; i <= fileLen; i++) {
  while (s.charAt(i) != 13 && s.charAt(i + 1) != 10) {

    while (s.charAt(i) != 9) {
      n1.add((int) s.charAt(i));
      i++;
    }
    // skip TAB
    i++;
    // next for other column

Ответы [ 2 ]

1 голос
/ 23 мая 2019

Вместо переменных 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 не обязательно должен выбирать самый простой способ.

1 голос
/ 23 мая 2019

Вот, пожалуйста,

    String str = "1 2 3 4 5 6 \n 1 2 3 4 5 6 \n 1 2 3 4 5 6";
    Arrays.asList(str.split("\n")).stream().map((s) -> s.split(" ")).map((splitBySpace) -> {
        for (String sp : splitBySpace) {
                System.out.print(sp);
            }
            return splitBySpace;
        }).forEachOrdered((String[] _item) -> {
            System.out.println();
    });

--- Выход ---
123456
123456
123456

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...