在地图中搜索并行的多个键

时间:2015-08-03 15:02:33

标签: java dictionary parallel-processing

给出Map<String, Collection<String>>最多1M项。我知道如何查询5K键的Map,其中我不确定它们是否在地图中。

目前,我正在使用TreeMap并逐个搜索每个项目。这似乎是次优的。是否有一种已经实现的方法来查询Map for X键?

搜索结果应该是在Map中找到的项目的子集,以便进一步查询 - 排序无关紧要。

我希望使用stream,但显然,这只适用于收藏。

注意:这个数字是印象,从我在地图上看到的,可能不是上限......

4 个答案:

答案 0 :(得分:1)

没有比为每个元素查询地图更好的方法了:

List<V> vs = keysToSearch.stream()
                         .map(k -> map.get(k))
                         .filter(Objects::nonNull)
                         .collect(Collectors.toList())

如果您的数据结构在并发环境中工作,也可以尝试使用parallelStream

答案 1 :(得分:1)

假设记忆不是你的问题。这是一种做法。

使用retainAll

Set<String> mapKeys = new HashSet<String>(myMap.keySet());

mapKeys.retainAll(my5kKeys);  //<--- all keys that match the my5kKeys...

答案 2 :(得分:1)

如果您的地图中有M个项目,并且您正在搜索K个键,那么您的最佳效果是O(min(M,K))。如果M非常大,那么你能做的最好就是检查每个K(也许是并行,但你必须每个都做。)

如果的情况是M的结果远小于K,那么只需检查所有的M值,看看它们是否存在于K中就可以做得更好。无论如何,你想要检查较小的集合的值与较大的值。

答案 3 :(得分:1)

没有更好的方法来创建循环并单独搜索所有密钥。 像retainAll这样的方法只是围绕其他人编写的循环的包装。

但重要的是使用HashMap代替TreeMap。 Hashmaps contains为O(1),而Treemap为O(log(n))。

如果您需要为其他内容添加已排序的集合,则可以将数据放在TreeMapHashMap中。

相关问题