块是代表类型的一些长期存在的实例,例如,BlockType grass、green_wool等.
我正在试图找到一个DataStructure,它可以有效地存储和测试给定的BlockPattern (比如,一个黑社会门户,Wither等等,如果您熟悉“我的世界”),但是如果您不熟悉,可以创建一个类来测试给定的Vector3i相对于要放置的块的块构建的给定结构。
Vector3i表示一个整数向量,表示给定谓词可以匹配的“块模式”中的位置。
例如,您可以有一个谓词来测试任意块属性的“热度”,该属性测试火和熔岩是否正确。
因此,每次都不要扫描整个模式,以确保块在世界上的位置,匹配谓词,我正在考虑扭转这个问题。
缓存块在multimap中可以处于模式中的潜在位置,并获取所有可能的位置,以限制随后发生的检查数量。
所以我有一个Multimap<Predicate<Block>,Vector3i> patternLookup缓存。
它表示允许在BlockPattern中找到块的潜在位置。
因此,播放器放置一个块,我需要过滤多个时间点,收集所有可能的位置块是‘允许’(谓词真)在其中。
但是,作为优化步骤,我认为只测试具有潜在匹配(在身份方面)的谓词可能更快。(3年过去了,我不确定这个假设是否正确)
如何使用番石榴的功能特性过滤multimap的内容以获得值的集合?(还是我最好只是迭代一下EntrySet呢?)
例如:
发布于 2017-12-07 20:45:17
您可以使用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()));
}这与您在问题中提到的multimap类型签名并不完全匹配,但我假设block和Vector3i在某种程度上是相关的,否则您就无法将谓词应用于这些值。
这将返回备份multimap的视图,该视图可以自由构造(O(1)),但在访问时应用筛选,因此返回的多个时间点上的.get()是O(n)。根据预期的用例,您可能更愿意将这个multimap复制到一个单独的不可变的multimap中,因此过滤只发生一次。
https://stackoverflow.com/questions/26940816
复制相似问题