我在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个数字变为Massive1,
2个数字为mass2,
3个数字代表mass3,
4个数字为mass4,
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
答案 0 :(得分:1)
您在这里,
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
答案 1 :(得分:1)
使用变量长度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>
,这是对每个String的一种迭代。Stream.map
将使用Integer :: valueOf的每个String转换为Integer。Stream.collect
将每个Integer收集到一个列表中。流非常富有表现力,但可能不适合初学者使用,因为它们将所有流组合成一个表达式,很容易引起错误。
理解问题之后:
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答案不一定是最简单的方法。