过滤MultiMap <predicate,value =“”> </predicate,>

时间:2014-11-14 23:57:12

标签: java filter functional-programming guava predicates

Block是一些代表类型的长期实例,例如一个Minecraft BlockType草,green_wool等。

我正在尝试找到一个可以有效存储和测试给定BlockPattern的DataStructure(如果您熟悉Minecraft,就像黑曜石门户,Wither等),但如果您不熟悉,可以创建一个可以测试给定结构的类,该结构是在给定的Vector3i相对于正在放置的块的块上构建的。

Vector3i表示给定谓词可以匹配的“块模式”中的整数向量。

e.g。你可以有一个谓词来测试一个任意的块属性'hotness',它可以测试火焰和熔岩的真实性。

因此,每次扫描整个模式,以确保世界中的块位置与谓词匹配,我正在考虑扭转问题。

缓存块可以在多图中的模式中的潜在位置,并获取所有可能的位置,以限制之后发生的检查量。

所以我有一个Multimap<Predicate<Block>,Vector3i> patternLookup缓存。

表示允许在BlockPattern中找到块的潜在位置。

所以玩家放置一个Block,我需要过滤Multimap,收集块被“允许”(谓词为真)的所有可能位置。

然而,作为优化步骤,我认为仅测试具有潜在匹配的谓词(在身份方面)可能更快。 (3年后,我不确定这个假设是否属实)

如何使用guava的功能特征过滤多图的内容以获取值集合? (或者我最好只是迭代EntrySet?)

e.g。

1 个答案:

答案 0 :(得分:1)

可以使用Multimaps.filterEntries(),例如:

public static <V> Multimap<Predicate<V>, V> filterByPredicateKey(
    Multimap<Predicate<V>, V> multimap) {
  return Multimaps.filterEntries(multimap, e -> e.getKey().apply(e.getValue()));
}

这与您在问题中提到的多地图类型签名不完全匹配,但我认为blockVector3i在某种程度上相关,否则您无法将谓词应用于值反正。

这将返回后备多图的视图,该视图是免费的( O(1)),但在访问时应用过滤,因此返回的多图上的.get()为< EM> O(n)的。根据预期的用例,您可能更喜欢将此多图复制到单独的不可变多图中,因此过滤只发生一次。