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。
答案 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()));
}
这与您在问题中提到的多地图类型签名不完全匹配,但我认为block
和Vector3i
在某种程度上相关,否则您无法将谓词应用于值反正。
这将返回后备多图的视图,该视图是免费的( O(1)),但在访问时应用过滤,因此返回的多图上的.get()
为< EM> O(n)的。根据预期的用例,您可能更喜欢将此多图复制到单独的不可变多图中,因此过滤只发生一次。