2016-05-15 18 views
0

ツリー構造の実装には助けが必要ですが、ツリーにデータを追加する追加子機能を作成しましたが、子を追加する際に問題があるようです。Javaのツリー構造へのtxtファイルの読み込み

私は木が見えるようにしたいもの:

    Date 
      / |  \ 
     /  |  \ 
     /  |   \ 
    /   |   \ 
    20160101  20160102  20160103 
    /    |  |  \ 
12:00   13:00 12:00  13:00 
/ \   / \  |  / \ 
Here There  Here There Here Here  There 

例のtxtファイル:

 
Date,Time,Location 
20160101,12:00,Here 
20160101,12:00,There 
20160102,13:00,Here 
20160102,13:00,There 
20160103,12:00, Here 
20160103,13:00, Here 
20160103,13:00, There 
日付の出力は罰金だ

が、それは2つの日付を示し

私はしたくないので、同じ日付が2回表示されますが、時間と場所が間違っています。

は、予想される:

 
20160101 
12:00 
Here 
There 
20160102 
13:00 
Here 
There 
20160103 
12:00 
Here 
13:00 
Here 
There 

ACTUAL:

 
20160101 
12:00 
Here 
There 
13:00 
Here 
There 
20160102 
12:00 
Here 
There 
13:00 
Here 
There 
20160103 
12:00 
Here 
There 
13:00 
Here 
There 

私は私のコードの任意のヘルプやフィードバックを感謝しています。

public class Tree { 
    List<Tree> children = new ArrayList<Tree>(); 
    Tree parent = null; 
    String data = null; 

    public Tree(String data) { 
     this.data = data; 
    } 

    public Tree(String data, Tree parent){ 
     this.data = data; 
     this.parent = parent; 
    } 

    public void addChild(String data) { 
     Tree child = new Tree(data); 
     child.parent = this; 
     Boolean match = false; 
     for (int i = 0; i < this.children.size(); i++) { 
      if (this.children.get(i).data.equals(child.data)) { 
       match = true; 
       break; 
      } 
     } 
     if (!match) { 
      this.children.add(child); 
     } 
    } 

    public void addChild(Tree child) { 
     Boolean match = false; 
     for (int i = 0; i < this.children.size(); i++) { 
      if (this.children.get(i).data.equals(child.data)) { 
       match = true; 
       break; 
      } 
     } 
     if (!match) { 
      this.children.add(child); 
     } 
    } 

    public static void main(String[] args) throws IOException { 
     long startTime = System.nanoTime(); 
     Scanner scanFile = new Scanner(new File("example.txt")); 
     String line = ""; 
     line = scanFile.nextLine(); 
     Tree parentNode = new Tree(line.split(",")[0]); 
     Tree dateNode = new Tree(null, parentNode); 
     Tree timeNode = new Tree(null, dateNode); 
     Tree locationNode = new Tree(null, timeNode); 
     System.out.println(parentNode.data); 

     while(scanFile.hasNext()) { 
      line = scanFile.nextLine(); 

      timeNode.addChild(line.split(",")[2]); 
      dateNode.addChild(line.split(",")[1]); 
      parentNode.addChild(line.split(",")[0]); 
     } 
     scanFile.close(); 



     for(int i =0; i < parentNode.children.size(); i++) { 
      System.out.println(parentNode.children.get(i).data); 
      for(int j = 0; j < dateNode.children.size(); j++) { 
       System.out.println(dateNode.children.get(j).data); 
       for(int k = 0; k < timeNode.children.size(); k++) { 
        System.out.println(timeNode.children.get(k).data); 
      } 
    } 

    long endTime = System.nanoTime(); 
    System.out.println("Time taken: " + (endTime - startTime)/1E9 + "s"); 
    } 
} 
+0

することになって、あなたの木のロジックとは何ですか?あなたの印刷は、 'parentNode'の各要素に対して' dateNode'と 'timeNode'から同じデータを繰り返し印刷します。 – RealSkeptic

+0

'timeNode'のすべての子データと' parentNode'の各要素の 'dateNode'のすべての子データを出力することになっています。問題は' dateNode.children'のサイズです。 'timeNode.children'は1だけです – phat

+0

もう一度問題は、ツリー構造が意味をなさない(あなたが構築するはずのツリーを説明していない)こと、そして印刷が間違っていることです。スキャンを終了した後は、 'timeNode'と' dateNode'に何も割り当てられていないので、スキャンした最後の値が保持されます。あなたは質問を編集し、木の葉の論理を説明してください。デバッガを使用してプログラムを段階的に実行し、ノードに実際に含まれていることを確認できるようにすることが重要です。 – RealSkeptic

答えて

-1

これらを試してみてください。

List<String> lines = new ArrayList<>(); 
Map<String,Map<String,List<String>>> tree = new TreeMap<String,Map<String,List<String>>>(); 

    for(int i=0;i<lines.size();i++){ 

     String[] parts = lines.get(i).split(","); 

     if(!tree.containsKey(parts[0])){ 
      tree.put(parts[0],new TreeMap<String,List<String>>()); 
     } 

     Map<String,List<String>> tree2 = tree.get(parts[0]); 

     if(!tree.containsKey(parts[1])){ 
      tree2.put(parts[1],new ArrayList<String>()); 
     } 

     List<String> tree3 = tree2.get(parts[1]); 

     if(!tree3.contains(parts[2])){ 
      tree3.add(parts[2]); 
     } 

    } 
関連する問題