0

このような文字列値のリストがあります...A、A_AChild、A_AChild_furtherChild、A_BChild、A_CChildなど。「UnderScore」で区切られたこれらの値は、Aが親であり、AChildがその子であり、AChildがfurtherChildの親であることを表します。類似のBChildとCChildの親はAです。表現のために構造のようなツリーを作成する必要があります。

A
 AChild
  furtherChild
 BChild
 Child

どうすればこれを達成できますか。どんなアルゴリズムやJavaプログラムでも大歓迎です。

4

2 に答える 2

0

まず、ノードとツリーデータ構造を作成します。

Node:
Node(String value)


Tree
Tree(Node node) : Creates a tree with root as node

Node getNode(Node node, String nodeToRetrive) nodeToRetrive will be a child of node
returns null if not found

Node addNode(Node node, String nodeToBeAdded) nodeToBeAdded will be added as a new child of node and the newly added Node would be returned

ルートをAとしてツリーを作成します。

Node root=new Node("A");
Tree tree=new Tree(root);

入力文字列を「_」でトークンに分割します。たとえば、「A_AChild_furtherChild」は「A」、「AChild」、「furtherChild」に分割されます。

String s="A_AChild_furtherChild";
String[] tokens=s.split("_");

2番目(この場合は「AChild」)から始まるトークンをループし、必要な処理を実行します。

Node node=tree.root; Node n;
for( i=1 ;i <tokens.length; i++){
  n=getNode(node,tokens[i]);
  if(n==null){
    n=addNode(node,tokens[i]);
  }
  node=n;
}

上記のループを使用して、ツリー全体を構築できます。

ツリー内のノードの値を再帰的に取得します。

public void printTree(Node n, int level){
  display level number of spaces and print the value held by Node n.
  for(each of the children of n){
    printTree(theChild, level+1)
  }
}

上記の再帰メソッドは、最初は次の方法で呼び出されます。

printTree(root,0);
于 2012-10-26T06:46:39.070 に答える
0

私は自分でこの問題を解決しました..:-)

これはコードです。私はそれが効率的ではないかもしれないことを知っています:

Set<String> treeSet = new TreeSet<String>();
        treeSet.add("FEES");
        treeSet.add("FEES_NUSF");
        treeSet.add("FEES_NUSF_NUS1");
        treeSet.add("EXPE");
        treeSet.add("EXPE_NUSE");

        for (String string : treeSet) {


            int splitSize = string.split("_").length;

            if( splitSize > 1 ){
                //log("In if : "+splitSize);
                StringBuilder sb = new StringBuilder("");
                for (int i = 0; i < splitSize; i++) {
                    sb.append(" ");
                }
                sb.append(string);
                print(sb.toString());
            }
            else{
                print(string);
            }
        }
于 2012-10-26T08:21:40.997 に答える