-1

Java Trieクラスの作成とテスト、および私のメインクラスが何らかの理由でハングアップしていて、プログラムの実行が終了することはありません。

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){

    }
}

}
}

挿入操作は物事がハングアップしている場所だと思います。テキストファイルはランダムな文字列にすぎません。「犬の神犬の行為cataasfdohaosifdhoawrhi」

4

1 に答える 1

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>("");
于 2012-11-04T08:34:40.933 に答える