java从文本中选出单词_java-获取其中出现特定单词/文本的行号

我所拥有的:我有一个逐行读取的文件.这些行不计入文件中.

我想做什么:我想对一个流中的每一行进行计数,并仅返回出现特定文本的数字.

到目前为止,我有:

public static Integer findLineNums(String word)

throws IOException {

final Map map = new HashMap<>();

final List lines = Files.lines(Paths.get(PATH)).collect(Collectors.toList());

IntStream.rangeClosed(0, lines.size()-1).forEach(f -> map.put(lines.get(f), f+1));

return map.get(word);

}

问题:如何仅使用单个流执行此操作?

编辑问题:我想在Stream中做所有事情,这还包括将其累积到列表中.

最佳情况是:

Files.lines(Paths.get(PATH)).superAwesomeStreamFuncs().collect(Collectors.toList());

编辑:就我而言,我只会返回一个Integer,但我想获得类似Integer List的信息.

解决方法:

这有效:

int[] i = new int[]{0}; // trick to make it final

List hits =

.map(s -> s.contains(word) ? ++i[0] : - ++i[0])

.filter(n -> n > 0)

.collect(Collectors.toList());

这里的主要“技巧”是使用数组,该数组的引用不会改变(即它是“有效的最终”),但它使我们可以将其(仅)元素更改为计数器,无论如何,该元素都可以在线递增.快速筛选器会排除不匹配项.

一些测试代码:

String word = "foo";

int[] i = new int[]{0};

List hits = Stream.of("foo", "bar", "foobar")

.map(s -> s.contains(word) ? ++i[0] : - ++i[0])

.filter(n -> n > 0)

.collect(Collectors.toList());

System.out.println(hits);

输出:

[1, 3]

标签:stream,java

来源: https://codeday.me/bug/20191028/1952097.html

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值