繁体   English   中英

使用Java流的MinMaxPriorityQueue

MinMaxPriorityQueue using Java streams

提示:本站收集StackOverFlow近2千万问答,支持中英文搜索,鼠标放在语句上弹窗显示对应的参考中文或英文, 本站还提供   中文繁体   英文版本   中英对照 版本,有任何建议请联系yoyou2525@163.com。

我正在寻找一种内存有效的Java方法来从巨大的集合中找到前n个元素。 例如,我有一个单词,distance()方法和“all”单词的集合。 我已经实现了一个实现compareTo()的类Pair,以便按对它们的值进行排序。

使用流,我的天真解决方案看起来像这样:

double distance(String word1, String word2){
  ...
}

Collection<String> words = ...;
String word = "...";

words.stream()
  .map(w -> new Pair<String, Double>(w, distance(word, w)))
  .sorted()
  .limit(n);

据我所知,这将处理并中间存储每个元素的单词,以便在应用limit()之前对其进行排序。 但是,拥有一个存储n个元素的集合更加节省内存,每当添加一个新元素时,它会删除最小的元素(根据可比对象的自然顺序),因此永远不会大于n(或n + 1) )。

这正是Guava MinMaxPriorityQueue所做的。 因此,我目前对上述问题的最佳解决方案是:

Queue<Pair<String, Double>> neighbours = MinMaxPriorityQueue.maximumSize(n).create();
words.stream()
  .forEach(w -> neighbours.add(new Pair<String, Double>(w, distance(word, w)));

在将队列转换为流或列表之后,仍然需要对前n个元素进行排序,但这不是问题,因为n相对较小。

我的问题是:有没有办法使用流做同样的事情?

1 个回复

基于堆的结构当然比排序整个庞大的列表更有效。 幸运的是,流媒体库非常乐意让您在必要时使用专门的集合:

MinMaxPriorityQueue<Pair<String, Double>> topN = words.stream()
    .map(w -> new Pair<String, Double>(w, distance(word, w)))
    .collect(toCollection(
            () -> MinMaxPriorityQueue.maximumSize(n).create()
    ));

这比.forEach解决方案更好,因为它很容易并行化,而且更加惯用java8。

注意() -> MinMaxPriorityQueue.maximumSize(n).create()应该可以用MinMaxPriorityQueue.maximumSize(n)::create替换,但由于某种原因,在某些情况下不能编译(参见下面的注释) )。

2 使用Java的活动流

我正在努力向我的应用程序添加活动流/新闻提要。 我的技术栈主要基于Java(Spring Boot)。 是否有任何基于Java的开源库可以帮助我入门(最好是使用Activity Stream 2.0规范的库)。 ...

3 如何使用Java 8流?

我想知道如何使用Java 8流以及如何使用不同类型的可用流操作。 例如,我写了这部分代码: 我想用java 8 stream api calls重写它。 我该怎么做? ...

4 Java流循环使用

对于Java流,我是一个新手。 我是否需要在此循环中每次都重新创建流,或者有更好的方法吗? 创建一次流并使用.noneMatch两次将导致“流已关闭”异常。 谢谢 ! ...

5 使用Java的流密码

我正在尝试使用Java创建流密码,在该密码中,我将从文件中获取纯文本进行加密(使用带有种子值的随机密钥对简单XOR进行加密),然后将其存储在其他文件中,然后解密,再次获取密文从文件中解密并解密(与密钥相同的XOR操作作为加密)并存储在文件中。 但是,当我尝试加密大字符串时遇到了问题。 字 ...

6 Java 8流-在流操作中使用原始流对象

我在Integer数组上运行Stream操作。 然后,我创建一个Cell对象,该对象进行一些操作并应用过滤器, 我想只用有效的Cell创建一个Integer到Cell的映射。 这句话: 是否可以在流操作中使用原始流对象? ...

7 序列化Guava的MinMaxPriorityQueue

经过几天的研究,为什么我的Flink应用程序无法正常运行,我得出的结论是问题出在我正在使用的MinMaxPriorityQueue 。 看来此结构不可序列化。 我尝试了几种方法来对其进行序列化: 他们所有人都没有运气。 但是我发现了这一点: 序列化Guava的Immutab ...

8 坚持使用Java 8流

我正在尝试学习如何在Java 8中使用Streams,但我不知道如何在这里进行操作。 我有一份课程清单。 我需要知道一个学期的所有课程是否都没有学生,如果是这样,那就做点什么。 我想出了下面的代码,但是只要任何课程被迭代而没有任何学生,这就会给出Null Pointer Excepti ...

9 使用 Java 流查找不同的数组

考虑这个代码 我希望distinct列表包含colours1 2 元素colours1和colours2 (因为 1 和 3 是等效的)。 然而,因为流distinct()方法执行相等比较,它仍然包含所有 3 种颜色数组。 我想要一个自定义的不同功能,您可以在其中提供比较器。 在这种情况下, O ...

10 使用java流解析列表

我的用例是我有餐馆对象的列表,其中包含属性作为城市,类型,评级,我想按照给定组合(城市,类型)的最高评级打印列表。 当我创建这个例子来混淆java流时,请回复如何使用流来实现: ...

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2022 STACKOOM.COM