Java 如何从文件中获取以某个单词开头的行,如果不匹配,如何获取以另一个单词开头的行

Java 如何从文件中获取以某个单词开头的行,如果不匹配,如何获取以另一个单词开头的行,java,java-8,java-stream,Java,Java 8,Java Stream,从文件中获取以某个字符串开头的行的最佳方法是什么?如果找不到这样的行,则获取以另一个字符串开头的行 比如说。有两条线 aaa bbb 还有一个带字符串的文件。需要获取所有以aaa开头的行。如果没有这样的行,那么获取所有以bbb开头的行 用于带行的文件 aaa 1 bbb 2 aaa 3 ccc 4 zzz 1 bbb 2 zzz 3 返回必须是 aaa 1 aaa 3 用于带行的文件 aaa

从文件中获取以某个字符串开头的行的最佳方法是什么?如果找不到这样的行,则获取以另一个字符串开头的行

比如说。有两条线

    aaa
    bbb
还有一个带字符串的文件。需要获取所有以aaa开头的行。如果没有这样的行,那么获取所有以bbb开头的行

用于带行的文件

    aaa 1
    bbb 2
    aaa 3
    ccc 4
    zzz 1
    bbb 2
    zzz 3
返回必须是

    aaa 1 
    aaa 3
用于带行的文件

    aaa 1
    bbb 2
    aaa 3
    ccc 4
    zzz 1
    bbb 2
    zzz 3
返回必须是

    aaa 1 
    aaa 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());
            }

有更好的方法吗?

您可以尝试使用循环来代替硬编码aaa和bbb。也许可以尝试一下类似的方法

列表行=空; 列表结果=空; 整数maxValue=null; 请尝试Stream=Files.linesPaths.gettest.txt{ 线=流 .filterl->l.startsWithaaa | | l.startsWithbbb .toList; }捕获IOE{} 如果行!=空的{ 对于int i=0;i<26;i++{ 字符字母=字符“a”+i; 结果=lines.stream.filterl->l.startsWith+letter+letter+letter+letter.collectCollectors.toList; 如果结果为!=null{ 打破 } }
} 您可以按行的子字符串对行进行分组,并在生成的映射上调用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) {
}

如果您试图打印匹配行,那么您可以使用下面的代码重构您的代码

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

通常情况下,你会发布你尝试过的内容,并说出哪里出了问题。否则这是一个“为我做”的帖子。。。至少描述一下你的算法太笨拙了好吧,对不起。我在问题中添加了我尝试过的例子。