如何从文件中开始一些单词开始,如果没有匹配,请从另一个单词开始



从一个以某个字符串开始获取文件的最佳方法是什么,如果找不到这样的行,然后从另一个字符串开始。

例如。有两个字符串

    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);
}

相关内容

最新更新