【发布时间】:2013-06-21 19:07:18
【问题描述】:
我想知道是否有比我一直在做的更有效的方法来搜索多树。我最近为一个项目构建了一个多树数据结构,如下图所示。
洞穴会将各方放在一个数组列表中。不同的政党将拥有不同的生物。不同的生物会持有不同的物品。
我需要一种方法来搜索整个树,以将对象与它具有的属性(例如索引)进行匹配。这是我的程序的一个 sn-p,它搜索每个 ArrayList 以查看是否有一方、生物、宝藏或神器与我称为 index 的 int 匹配。
编辑(解释我的代码) Party、Creature、Treasure 和 Artifact 类都具有索引、名称、类型等属性。多树将 Cave 集作为根注释。 Cave 有一个 ArrayList 可以包含许多 Party 对象。每个 Party 都有一个 ArrayList,可以包含许多 Creature 对象。每个生物都有两个数组列表,一个用于保存神器对象,一个用于保存宝藏对象。
我在下面搜索以查看哪个派对、生物、神器或宝藏拥有我正在搜索的特定索引。我通过迭代派对来做到这一点,每个派对我都查看生物,每个生物我查看文物和宝藏。这就是为什么我在 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 中。
【问题讨论】:
-
我敢打赌圈复杂度分析器会喜欢这段代码...说真的,让我们避开Java代码并在纸上列举算法的目标。如果你能做到这一点,那么你可以找出一个稍微干净的方法/方法来解决这个问题。实际上,我没有看到任何“树”——事实上,您提供的代码 sn-p 不足以给您一个好的答案。您能否为此处的代码提供一些上下文,例如您要施加的规则是什么?
-
我不知道哪里有工具可以告诉你你的代码有多复杂!迫不及待想试试。那就是说我已经在纸上完成了这个,除了像上面那样循环之外我看不到其他方法。我是一个相对年轻的程序员,所以我仍在尝试构建我的工具集和知识。
-
如果 getIndex 是所有类的通用方法,您会考虑将其抽象为超类吗?如果您绝对需要,最后一种方法可能是使用 instaceof 或反射。
-
我认为break只会跳出内循环。
-
@isaach1000:
break将在那个级别跳出循环。更高级别的break语句将跳出更高级别的循环。
标签: java search optimization arraylist