Java 8 Streams修改集合值

华龙

使用流API;过滤掉相关数据后,我想编辑收集的数据。这是到目前为止的代码:

  String wordUp = word.substring(0,1).toUpperCase() + word.substring(1);
  String wordDown = word.toLowerCase();

  ArrayList<String> text = Files.lines(path)
        .parallel() // Perform filtering in parallel
        .filter(s -> s.contains(wordUp) || s.contains(wordDown) &&  Arrays.asList(s.split(" ")).contains(word))
        .sequential()
        .collect(Collectors.toCollection(ArrayList::new));

编辑下面的代码很糟糕,我正在尝试避免使用它。(它也不是完全有效。它是在凌晨4点完成的,请原谅。)

    for (int i = 0; i < text.size(); i++) {
        String set = "";
        List temp = Arrays.asList(text.get(i).split(" "));
        int wordPos = temp.indexOf(word);

        List<String> com1 = (wordPos >= limit) ? temp.subList(wordPos - limit, wordPos) : new ArrayList<String>();
        List<String> com2 = (wordPos + limit < text.get(i).length() -1) ? temp.subList(wordPos + 1, wordPos + limit) : new ArrayList<String>();
        for (String s: com1)
            set += s + " ";
        for (String s: com2)
            set += s + " ";
        text.set(i, set);
    }

它在文本文件中寻找一个特定的单词,一旦行被过滤掉,我只想每次只收集行的一部分。要搜索的关键字两侧的多个单词。

例如:

keyword = "the" limit = 1

它会发现: "Early in the morning a cow jumped over a fence."

然后应该返回: "in the morning"

* PS任何建议的速度改进都将被投票通过。

霍尔格

您应该考虑两个不同的任务。首先,将文件转换为单词列表:

List<String> words = Files.lines(path)
    .flatMap(Pattern.compile(" ")::splitAsStream)
    .collect(Collectors.toList());

这使用了您在空格字符处分割的最初想法。这对于简单的任务可能就足够了,但是,您应该研究的文档,BreakIterator以了解这种简单方法与真实,复杂的单词边界分割之间的区别。

其次,如果您有一个单词列表,那么您的任务是查找您word的匹配项String,并使用单个空格字符作为分隔符将单词连接起来,从而将匹配项周围的项目序列转换为单个匹配项

List<String> matches=IntStream.range(0, words.size())
    // find matches
    .filter(ix->words.get(ix).matches(word))
    // create subLists around the matches
    .mapToObj(ix->words.subList(Math.max(0, ix-1), Math.min(ix+2, words.size())))
    // reconvert lists into phrases (join with a single space
    .map(list->String.join(" ", list))
    // collect into a list of matches; here, you can use a different
    // terminal operation, like forEach(System.out::println), as well
    .collect(Collectors.toList());

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

forEach不修改java(8)集合

来自分类Dev

使用Java 8 Streams API对集合进行“包含”类型的查询

来自分类Dev

修改后的集合中的Java 8流

来自分类Dev

使用 Java 8 Streams 从另一个不同类型的集合更新集合

来自分类Dev

Java 8集合-过滤嵌套列表中的值

来自分类Dev

使用Java 8流修改列表中对象的属性值

来自分类Dev

Java 8 Streams Peek API

来自分类Dev

Parallelism and Flatmap in Java 8 Streams

来自分类Dev

Java 8流与集合存储

来自分类常见问题

Java 8 Streams可以对集合中的项目进行操作,然后将其删除吗?

来自分类Dev

使用Java 8的Streams和Lambdas表达式发布迭代集合的问题

来自分类Dev

Java 8修改流元素

来自分类Dev

使用 Java 8 Streams 修改列表中的字符串列表

来自分类Dev

Java 8:按字段对集合进行分组,然后使用流将集合展平并以映射值的形式加入集合?

来自分类Dev

Java8 Streams - 如何将内部映射的键值从“空”字符串修改为空对象

来自分类Dev

JAVA 8:更改值内流

来自分类Dev

Java 8 排序浮点值

来自分类Dev

Java 8 Streams int和Integer

来自分类Dev

Java 8 Streams:逐字读取文件

来自分类Dev

Java 8 Streams是否与.Net IEnumerable相同?

来自分类Dev

Java 8 Streams:构建多级/复合对象

来自分类Dev

Are Java 8 Streams the same as .Net IEnumerable?

来自分类Dev

Java 8 Streams并尝试使用资源

来自分类Dev

Java 8 Search ArrayList与Streams算法失败

来自分类Dev

Java 8 Streams int和Integer

来自分类Dev

Java 8 Streams中的可变参数

来自分类Dev

使用Java 8 Streams进行类的学习

来自分类Dev

Java 8 Streams,无法编译的示例

来自分类Dev

Java 8 Streams - 要列表的嵌套映射

Related 相关文章

热门标签

归档