2012-11-04 45 views
-1

創建和測試Java Trie類,並且我的主類因任何原因掛起,運行程序永遠不會終止。Java Trie Hang Up

import java.util.*; 

public class Trie<T> { 
private Node<T> root; 

private int count; 

public Trie(T rootContent){ 
    root= new Node<T>(rootContent); 
    count=0; 
} 
public void insert(T[] content){ 
    Node<T> current=root; 
    if(content !=null){ 
     if(content.length==0){ 
      current.setFlag(true); 
     } 
     for(int i=0; i<content.length;i++){ 
      Node<T> child=current.getChild(content[i]); 
      if(child!=null){ 
       current=child; 
      } 
      else{ 
       current=current.addChildren(content[i]); 
      } 
      if(i==content.length-1){ 
       if(current.isLast()){ 
        current.setFlag(true); 
        count++; 
       } 
      } 
     } 
    } 
} 

public boolean search(T[] content){ 
    Node<T> current=root; 
    for(int i=0;i<content.length;i++){ 
     if(current.getChild(content[i])==null){ 
      return false; 
     } 
     else{ 
      current=current.getChild(content[i]); 
     } 
    } 
    if(current.isLast()){ 
     return true; 
    } 
    else{ 
     return false; 
    } 

} 


public int getCount(){ 
    return count; 
} 

public String toString() { 
    StringBuilder sb = new StringBuilder(); 
    sb.append("number entries: "); 
    sb.append(count); 
    return sb.toString(); 
} 
private static class Node<T>{ 
    private T content; 

    private boolean endFlag; 

    public List<Node<T>> children=new ArrayList<Node<T>>(); 

    public Node(T content){ 
     this.content=content; 
     this.endFlag=false; 
     this.children=new ArrayList<Node<T>>(); 
    } 

    public T getContent(){ 
     return content; 
    } 

    public Node<T> addChildren(T content){ 
     Node<T> t=new Node<T>(content); 
     children.add(t); 
     return t; 
    } 

    public Node<T> getChild(T content){ 
     if(children!=null){ 
      for(Node<T> t : children){ 
       if(t.getContent().equals(content)){ 
        return t; 
       } 
      } 
     } 
     return null; 
    } 

    public void setFlag(boolean endFlag){ 
     this.endFlag=endFlag; 
    } 

    public boolean isLast(){ 
     return endFlag; 
    } 

} 
public static void main(String[] args) { 

     Trie file1=new Trie(""); 
     Trie file2=new Trie(""); 
     if(args.length==0 || args[0]==null){ 
      System.out.println("Please give a valid command file"); 
     } 
     else{ 
     try{  
     Scanner reader1 = new Scanner(new FileInputStream(args[2])); 
     Scanner reader2 = new Scanner(new FileInputStream(args[3])); 
     String d=args[0]; 
     String n=args[1]; 
     int depth=Integer.parseInt(d); 
     int numberOfStrings=Integer.parseInt(n); 
     while(reader1.hasNext());{ 
      String[] ary=reader1.next().split(""); 
      file1.insert(ary); 
     } 
     while(reader2.hasNext());{ 
      String[] ary=reader1.next().split(""); 
      file2.insert(ary); 
     } 
     reader1.close(); 
     reader2.close(); 
     System.out.print(file1); 
     System.out.print(file2); 
    } 
     catch(Exception e){ 

    } 
} 

} 
} 

我想插入操作就是事情的杭寧時,該文本文件只不過是隨機字符串更多的「狗 神 狗 行爲 CATA asfdoh aosifdh oawrhi」

回答

0

展望在這些行顯示問題:

while(reader1.hasNext());{ 
     String[] ary=reader1.next().split(""); 
     file1.insert(ary); 
    } 
    while(reader2.hasNext());{ 
     String[] ary=reader1.next().split(""); 
     file2.insert(ary); 
    } 

不應該有一個分號在while(reader2.hasNext())while(reader1.hasNext())之後,因爲這會終止循環。我實際上並不確定爲什麼這裏的分號會導致它掛起,但由於某種原因,它確實存在。我相信有人能夠幫助我們在這裏,但刪除分號將解決這個問題。然而,奇怪的是,代碼是可編譯的。

您使用的是IDE嗎?如果你是這樣,將來你應該嘗試在IDE中調試你的代碼,然後在這裏尋求幫助。節省每個人的時間,這是一個很好的(閱讀:必要)技能。

另外爲了進一步參考,您已經參數化了Trie的類型,但是在實例化它時沒有指定類型。

Trie file1=new Trie(""); 

應該

Trie<String> file1=new Trie<String>(""); 
+0

謝謝你,這麼簡單的錯誤。 –

+0

不用擔心。樂意爲您的項目的其餘部分提供幫助並帶來好運。 – mricci