我想在每行列表中添加3个三位数字。
我试图创建一个计数,但是做得不好。
int i = 0;
try (Scanner s = new Scanner("final.txt"))) {
String line;
while (s.hasNextLine()) {
int change2Int = s.nextInt();
s.nextLine(); // ignore the rest of the line
figures [i] = change2Int;
i++;
}
}
}
所以我有一个大约20行的txt文件。一行看起来像这样:(第一个块是FROM:时,分,秒。||第二个是TO:时,分,秒。||,最后是:电话号码|
这是txt文件中的一行: “ 6 1 0 6 2 25 392712621”
我想添加前三个数字(前三个表示:“从小时(6)分钟(1)秒(0)
下一个3表示“至:小时(6)分钟(2)秒(25)
并且392712621是电话号码。
我想将前三个数字添加到列表中,然后将后三个数字添加到另一个列表中。 并做到每一行。
我该怎么办?
答案 0 :(得分:0)
使用具有三个分组操作的正则表达式。将三个数字序列分组,然后是三个数字序列,然后是最后一个序列。测试输入是否与模式匹配,然后拉出三组。喜欢,
String s = "6 1 0 6 2 25 392712621";
Pattern p = Pattern.compile("(\\d+ \\d+ \\d+) (\\d+ \\d+ \\d+) (\\d+)");
Matcher m = p.matcher(s);
if (m.matches()) {
System.out.println(m.group(1).trim());
System.out.println(m.group(2).trim());
System.out.println(m.group(3).trim());
}
我得到了(按要求)
6 1 0
6 2 25
392712621
答案 1 :(得分:0)
这可以解决问题,
import java.io.File;
import java.io.FileNotFoundException;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class Main {
public static void main(String[] args) throws FileNotFoundException {
Scanner s = new Scanner(new File("final.txt"));
List<String> firstList = new ArrayList<>();
List<String> secondList = new ArrayList<>();
while (s.hasNextLine()) {
String line = s.nextLine();
String[] digits = line.split(" ");
for (int i = 0; i < 3; i++) {
firstList.add(digits[i]);
}
for (int i = 3; i < 6; i++) {
secondList.add(digits[i]);
}
}
System.out.println(firstList);
System.out.println(secondList);
}
}
答案 2 :(得分:0)
首先,我建议按以下方式读取文件:
try (Stream<String> stream = Files.lines(Paths.get("final.txt"))) {
...
} catch (IOException e) { e.printStackTrace(); }
因为它将使您的生活更加轻松:
第二,我不会维护两个相关数据列表,而是创建一个模型来表示它:
class HourModel {
public HourModel(LocalTime from, LocalTime to) {
this.from = from;
this.to = to;
}
private LocalTime from;
private LocalTime to;
}
不是最有意义的名称,但我将其称为HourModel
仅出于示例目的。我希望您将其重命名以使其更有意义。
最后,您可以使用以下方法获得想要的结果:
List<HourModel> hourModels;
try (Stream<String> stream = Files.lines(Paths.get("final.txt"))) {
hourModels = stream.map(line -> {
String[] numbers = line.split(" ");
LocalTime from = LocalTime.of(Integer.parseInt(numbers[0]),Integer.parseInt(numbers[1]),Integer.parseInt(numbers[2]));
LocalTime to = LocalTime.of(Integer.parseInt(numbers[3]),Integer.parseInt(numbers[4]),Integer.parseInt(numbers[5]));
return new HourModel(from , to);
}).collect(Collectors.toList());
} catch (IOException e) { e.printStackTrace(); }
请注意,我使用LocaleTime
来表示hour
,minute
和second
只是因为这是更好的表示方式。
答案 3 :(得分:0)
我认为在这种情况下,使用Scanner
并不是最佳选择(但是您可以根据需要)。我提供使用Java8功能和Stream
来逐行读取文本文件。
还有我们的RegExp,它们具有代表每行的命名组。
因此,您可以使用LocalTime
。
public static void readFile(Path path, List<LocalTime> from, List<LocalTime> to) throws IOException {
final Pattern pattern = Pattern.compile("(?<fromHour>\\d+)\\s+(?<fromMinute>\\d+)\\s+(?<fromSecond>\\d+)\\s+" +
"(?<toHour>\\d+)\\s+(?<toMinute>\\d+)\\s+(?<toSecond>\\d+)\\s+(?<data>\\d+)");
Files.lines(path)
.map(pattern::matcher)
.filter(Matcher::matches)
.forEach(matcher -> {
from.add(localTime(matcher, "fromHour", "fromMinute", "fromSecond"));
to.add(localTime(matcher, "toHour", "toMinute", "toSecond"));
});
}
private static LocalTime localTime(Matcher matcher, String hour, String minute, String second) {
int fromHour = Integer.parseInt(matcher.group(hour));
int fromMinute = Integer.parseInt(matcher.group(minute));
int fromSecond = Integer.parseInt(matcher.group(second));
return LocalTime.of(fromHour, fromMinute, fromSecond);
}