从一个以某个字符串开始获取文件的最佳方法是什么,如果找不到这样的行,然后从另一个字符串开始。
例如。有两个字符串
aaa
bbb
和一个带有字符串的文件。需要从aaa
开始所有行。如果没有这样的行,请从bbb
开始所有行。
用于线条的文件
aaa 1
bbb 2
aaa 3
ccc 4
返回必须为
aaa 1
aaa 3
用于线条的文件
zzz 1
bbb 2
zzz 3
返回必须为
bbb 2
我知道如何做到这一点,但是我的解决方案在我看来太笨拙了。例如,我尝试了这样的:
List<String> lines = null;
List<String> result = null;
Integer maxValue = null;
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
lines = stream
.filter(l -> l.startsWith("aaa") || l.startsWith("bbb"))
.collect(Collectors.toList());
} catch (IOException e) {}
if (lines != null) {
result = lines.stream().filter(l -> l.startsWith("aaa")).collect(Collectors.toList());
}
if (result == null) {
result = lines.stream().filter(l -> l.startsWith("bbb")).collect(Collectors.toList());
}
有更好的方法吗?
您可以通过其子字符串对线进行分组,并在生成的地图上调用方法getordefault。假设您的文件至少包含以AAA或BBB开头的一行,则类似于下面的内容:
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
Map<String,List<String>> map = stream.collect(Collectors.groupingBy(s->s.substring(0, 3)));
map.getOrDefault("aaa", map.get("bbb")).forEach(System.out::println);
}
catch (IOException e) {
}
,而不是硬编码" AAA"one_answers" BBB",您可以尝试使用循环。也许尝试使用这些行?
List<String> lines = null;
List<String> result = null;
Integer maxValue = null;
try (Stream<String> stream = Files.lines(Paths.get("test.txt"))) {
lines = stream
.filter(l -> l.startsWith("aaa") || l.startsWith("bbb"))
.collect(Collectors.toList());
} catch (IOException e) {}
if (lines != null) {
for (int i = 0; i < 26; i++) {
char letter = (char) ('a' + i);
result = lines.stream().filter(l -> l.startsWith("" + letter + letter + letter)).collect(Collectors.toList());
if (result != null) {
break;
}
}
}
如果要打印匹配行,则可以使用以下
来重构您的代码try (Stream<String> stream = Files.lines(Paths.get("text.txt"))) {
stream.filter(l -> l.startsWith("aaa") || l.startsWith("bbb"))
.forEach(line -> System.out.println(line));
} catch (IOException e) {
System.out.println(e);
}