1

Block 是一些代表类型的长期存在的实例,例如 A Minecraft BlockType Grass、green_wool 等。

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

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

例如,您可以有一个谓词来测试任意块属性“热度”,以测试火和熔岩的真实性。

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

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

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

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

所以玩家放置了一个方块,我需要过滤多重地图,收集方块“允许”(谓词为真)所在的所有可能位置。

但是,作为一个优化步骤,我认为只测试具有潜在匹配的谓词(就身份而言)可能会更快。(三年后我不确定这个假设是否正确)

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

例如

4

1 回答 1

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()返回的多图为O(n)。根据预期的用例,您可能更愿意将此多映射复制到单独的不可变多映射中,以便过滤只发生一次。

于 2017-12-07T20:45:17.717 回答