2016-05-15 148 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 

的日期的输出显得精致,它显示了两个日期,因为我不希望相同的日期显示两次,但时间和地点是错误的。

预期:

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

实际:

 
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

它应该为'parentNode'的每个元素打印'timeNode'的所有子数据和'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]); 
     } 

    }