簡體   English   中英

Java字符串分割數

[英]Java string split numbers

我在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個數字為mass1,
2等於mass2,
3等於mass3,
4個數字為mass4,
5個數字到大量5,
6個數字到大量6

我知道如何使用許多for / while循環解決此任務,但我需要緊湊解決此任務。 也許我需要Patern.compileString.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

干得好,

    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

而不是massive1, ..., massive6不是變量長度List massives massive1, ..., massive6會更合適:

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.streamString[]轉換為Stream<String>這是對每個String的迭代。
  • 使用Integer :: valueOf時, Stream.map每個String轉換為Integer。
  • Stream.collect將每個Integer收集到一個List中。

流具有很高的表現力,但可能不適合初學者使用,因為它們將全部組合成一個表達式,很容易引起錯誤。


了解問題后:

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答案不一定必須選擇最簡單的方法。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM