【问题标题】:How to get lines starting with some word from file and if no match get lines starting with another word如何从文件中获取以某个单词开头的行,如果不匹配则获取以另一个单词开头的行
【发布时间】:2019-07-31 13:22:54
【问题描述】:

从文件中获取以某个字符串开头的行的最佳方法是什么,如果没有找到此类行,则获取以另一个字符串开头的行。

例如。有两个字符串

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

有没有更好的办法?

【问题讨论】:

  • 通常你会发布你尝试过的东西,并说出出了什么问题。否则这是一个“为我做”的帖子......至少描述你的算法太笨拙
  • 好的,抱歉。我添加了我在问题中尝试过的示例。

标签: java java-8 java-stream


【解决方案1】:

您可以按子字符串对行进行分组,并在生成的地图上调用 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) {
}

【讨论】:

    【解决方案2】:

    您可以尝试使用循环,而不是硬编码“aaa”和“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;
    		}
    	}
    }

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2019-12-02
        • 2021-02-15
        • 2014-08-13
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多