値が見つかった後、値を取得するのに問題があります。値のハッシュテーブルを作成することから始めましたが、最終的にはネストされたハッシュテーブルが必要であることがわかりました。問題が発生するにつれて、深さが不明な複数のレイヤーが必要になることがわかりました。基本的に、ハッシュテーブルのツリーを作成します。これが良いアプローチであったかどうかはよくわかりませんが、問題がますます複雑になったときに私が思いついたアプローチです。
分岐構造を動的に作成する方法はありますが、検索する文字列キーを指定して特定の分岐を取得するときに問題が発生します。構造の深さが不明であるため、トラバースする唯一の方法は、各ブランチに再帰的に飛び込み、そのレベルのキーセットに文字列値が存在するかどうかを確認することであると考えました。
この特定のセクションで私が抱えている問題は、値が見つかったらそのブランチを返すことですが、スタックを介して終了すると、目的の値が壊れてしまいます。とても親密な気がしますが、何かが足りないかもしれません。値が見つかったら例外をスローし、目的の値を例外としてキャッチすることを検討しました。しかし、これを行うのがもっと正しいはずだと思います。再帰関数またはデータ構造設計を正しく実装する方法に関するヘルプやアドバイスをいただければ幸いです。
public Hashtable<Object,Object> searchRollupTree(Hashtable<Object,Object> tree, String searchTerm){
Hashtable<Object,Object> returningTable = tree;
for(Object item: tree.keySet()){
if(tree.keyset().contains(searchTerm)){
returningTable = (Hashtable<Object, Object>) tree.get(searchTerm)
return returningTable;
}else{
searchRollupTree((Hashtable) tree.get(item.toString()),searchTerm);
}
}
Hashtable<Object, Object> voidReturningTable = new Hashtable<Object,Object>();
voidReturningTable.put("NotFound","Null");
return voidReturningTable;
}
}
問題はあなたが1の深さでハスタブルを見つけた場合、あなたはそれを返さないでしょう。
public Hashtable<Object,Object> searchRollupTree(Hashtable<Object,Object> tree, String searchTerm){
Hashtable<Object,Object> returningTable = tree;
for(Object item: tree.keySet()){
if(tree.keyset().contains(searchTerm)){
returningTable = (Hashtable<Object, Object>) tree.get(searchTerm)
return returningTable;
}else{
returningTable = searchRollupTree((Hashtable)
tree.get(item.toString()),searchTerm);
//assuming NotFound is only a key if no table was found
if(!returningTable.containsKey("NotFound"){
return returningTable;
}
}
}
Hashtable<Object, Object> voidReturningTable = new Hashtable<Object,Object>();
voidReturningTable.put("NotFound","Null");
return voidReturningTable;
}
PS:searchRollupTreeを呼び出す前に、要素が実際にHashTableであることを確認してから実行する必要があります。(そうでない場合は、おそらく実行をスローします)。
編集:voidTableの戻り値は、各HashTableの最初の要素によってのみ渡されるため、ループの外側に配置されました
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加