マルチツリーを検索するより効率的な方法があるかどうか疑問に思っています。私は最近、以下に示すプロジェクトのマルチツリー データ構造を構築しました。
洞窟は、パーティーを配列リストに保持します。さまざまなパーティーがさまざまなクリーチャーを保持します。異なるクリーチャーは異なるアイテムを保持します。
ツリー全体を検索して、オブジェクトをインデックスなどの属性に一致させる方法が必要でした。これは、すべての ArrayList を検索して、パーティー、クリーチャー、宝物、またはアーティファクトのいずれかがインデックスと呼ばれる int と一致するかどうかを確認する私のプログラムのスニペットです。
編集(コードの説明) クラス Party、Creature、Treasure、および Artifact にはすべて、インデックス、名前、タイプなどの属性があります。マルチツリーにはルート ノートとして設定された洞窟があります。Cave には、多数の Party オブジェクトを含むことができる ArrayList があります。各パーティーには、多数の Creature オブジェクトを含むことができる ArrayList があります。各クリーチャーには 2 つの配列リストがあり、1 つは Artifact オブジェクトを保持し、もう 1 つは Treasure オブジェクトを保持します。
以下では、探している特定のインデックスを保持しているパーティー、クリーチャー、アーティファクト、または宝物を確認するために検索しています。これを行うには、パーティーを繰り返し、各パーティーでクリーチャーを調べ、各クリーチャーでアーティファクトと宝物を調べます。そのため、for ループ内に非常に多くの for ループがあります :(.
case 0 :
int index = Integer.parseInt( stat );
for ( Party p : SorcerersCave.theCave.parties ) {
if ( index == p.getIndex()) {
generateInterface.theGame.printOutput( "\t" + p );
break;
} else {
for ( Creature c : p.members ){
if ( index == c.getIndex() ){
generateInterface.theGame.printOutput( "\t" + c );
break;
} else {
for ( Treasure t : c.inventory ){
if ( index == t.getIndex() ){
generateInterface.theGame.printOutput( "\t" + t );
break;
}
}
for ( Artifact a : c.artifacts ){
if ( index == a.getIndex() ){
generateInterface.theGame.printOutput( "\t" + a );
break;
}
}
}
}
}
}
このコードは複雑すぎて、従うのが難しいと思います。コードは機能しますが、そうでなければ本当に見栄えの良いコードに醜い汚れがあります。これを行うためのより良い方法、またはそれを改善する方法さえ見つけるために、私は周りを見回してきました。
注* プロジェクトの要件により、すべてのオブジェクトを同じ ArrayList に配置することは禁じられています。