ブロックは、タイプを表す長寿命のインスタンスです。たとえば、Minecraft の BlockType 草、green_wool などです。
特定の BlockPattern を効率的に格納およびテストできる DataStructure を見つけようとしています (Minecraft に精通している場合は、黒曜石のポータル、ウィザーなどを考えてください)。配置されているブロックに関連する特定の Vector3i のブロックから構築されている特定の構造をテストします。
Vector3i は、特定の述語が一致する「ブロック パターン」内の場所の整数ベクトルを表します。
たとえば、任意のブロック プロパティ 'hotness' をテストする述語を作成して、火と溶岩の true をテストすることができます。
そのため、毎回パターン全体をスキャンして、世界のブロックの位置が述語と一致することを確認するのではなく、問題を逆にすることを考えていました。
ブロックがマルチマップのパターンにある可能性のある潜在的な位置をキャッシュし、後で発生するチェックの量を制限するために、すべての潜在的な位置を取得します。
だから私はMultimap<Predicate<Block>,Vector3i>
patternLookupキャッシュを持っています。
これは、BlockPattern でブロックを見つけることができる潜在的な位置を表しています。
そのため、プレイヤーはブロックを配置します。マルチマップをフィルター処理して、ブロックが「許可されている」(述語 true) である可能性のあるすべての場所を収集する必要があります。
ただし、最適化のステップとして、(ID に関して) 一致する可能性のある述語のみをテストする方が速いのではないかと考えました。(3 年後、この仮定が正しいかどうかはわかりません)
グアバの機能を使用して、マルチマップのコンテンツをフィルタリングして値のコレクションを取得するにはどうすればよいですか? (または、単に繰り返し処理するほうがよいEntrySet
ですか?)
例えば