gpt4 book ai didi

Java 8 流 : How to read lines between two lines specified by line content

转载 作者:行者123 更新时间:2023-12-02 11:50:26 27 4
gpt4 key购买 nike

当前问题陈述的输入是 -

输入.txt

#START_OF_TEST_CASES

#DATA
key1:VA1
key2:VA2
key3:VA3
key4:VA4
key5:VA5
#DEND

#ENTRIES:
1{key1}{key1}{key3}
2{key2}{key2}{key1}
3{key3}{key1}{key2}
#EEND

现在我想读取此文件并创建 #DATA#DEND 之间的行的 HashMap。 HashMap 的键是“:”的左侧部分,值是右侧部分。虽然我们可以迭代地实现这一点,但我想使用 Java 8 的 Stream API 来实现这一点。

最佳答案

不幸的是,Java 8 流不支持在两个匹配之间提取元素。在 Java 9 中,您可以使用

Map<String,String> map;
try(Stream<String> stream = Files.lines(path)) {
map = stream
.dropWhile(s -> !s.equals("#DATA")).skip(1)
.takeWhile(s -> !s.equals("#DEND"))
.filter(Pattern.compile("^[^#].*:").asPredicate())
.map(item -> item.split(":", 2))
.collect(Collectors.toMap(parts->parts[0], parts->parts[1]));
}
// use the map
map.forEach((k,v)->System.out.println(k+" -> "+v));

dropWhile 将删除第一个匹配元素之前的所有元素,skip(1) 将跳过匹配元素,takeWhile 有效删除所有元素在第一个与结束条件匹配的元素之后。

使用模式 ^[^#].*: 的下一个 filter 步骤将跳过所有以 # 开头或不包含:。其余步骤很简单。当指定 split 的限制为 2 时,遇到第一个 : 后将不再搜索后续的 : .

在 Java 8 下,可以在流操作之前使用 Scanner 来提取两个匹配之间的部分:

String part;
try(Scanner s = new Scanner(path)) {
part = s.findWithinHorizon("(?<=\\R#DATA\\R)(.|\\R)*(?=\\R#DEND\\R)", 0);
}
Map<String,String> map = Pattern.compile("\\R").splitAsStream(part)
.filter(Pattern.compile("^[^#].*:").asPredicate())
.map(item -> item.split(":", 2))
.collect(Collectors.toMap(parts->parts[0], parts->parts[1]));
// use the map
map.forEach((k,v)->System.out.println(k+" -> "+v));

关于Java 8 流 : How to read lines between two lines specified by line content,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47912265/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com