2012-04-19 6 views
0

私は、MovieInfoオブジェクトをキーとするノードを使用してバイナリ検索ツリーを作成しています。 MovieInfoオブジェクトは、ID、fullName、およびshortNameの3つのフィールドを持つオブジェクトです。バイナリ検索ツリーは、IMDBにリストされているすべてのムービーを含む入力テキストファイルに関する情報を格納します。挿入物は、各映画にランダムに関連付けられたIDに基づいている。検索機能では、ユーザーがStringを入力し、オブジェクトの他のデータ(shortName、IDなど)をプルアップします。 今、私が持っているエラーは、findExactメソッドです。 まず、私の入力が何であっても、 "Current Node is null"というメッセージが表示されます。これは、開始currentNodeが常にnullになることを意味します。他の問題は、ルートノード(ツリー内で最初に検索されたcurrentNode)が正しく初期化されているかどうかを確認する方法がわかりません。これは私の問題と関係があるかもしれないという気持ちがあります。 他の問題は、最初にノードを挿入する方法にあります。 参考までに、このコードをテストする/テキスト入力ファイルで実行する方法はIndexTester.javaです。JavaのBST - 文字列によるノードの検索

更新:いいえ。すべてが今働きます。私が今行っている唯一の問題は、私のfindExactメソッドがMovieInfoクラスのIDフィールドを変更するように見えることです。だから私の検索は機能しません。例えば、I入力場合:

1568482 2 White Kids with Problems 2 White Kids with Problems 
1568487 Disorient Disorient 
1568488 DIY Playgrounds DIY Playgrounds 

と検索「混乱させる、」リターンは、(オブジェクト「の問題で2人のホワイトキッズ」のためのIDを持つ)「1568488混乱させる混乱さ」です。さらに、IDが取られているので... DIYのプレイグラウンドを検索することはできません。挿入メソッドは機能しますが、findExactメソッドが問題を起こしています。このIDの変更を引き起こした原因は何ですか?

MovieInfoクラス(別の.javaファイル) - 私は内部BST

import java.util.*; 
import java.io.*; 

public class BSTIndex extends MovieInfo { 

    public Node root; 
    public class Node{ 
     public MovieInfo movie; 
     public Node left, right; 

    public Node(MovieInfo movie) 
    { 
     this.movie = movie; 
     //this.val = val; 
     //this.N = N; 
     } 
    } 

    public BSTIndex() 
    /** 
    * constructor to initialize the internal binary search tree. 
    * The data element should be an object of the type MovieInfo, described above. 
    */ 
    { 
     super(0, "", ""); 

    } 


    public MovieInfo findExact(String key) { 
    return findExact(root, key); 
} 

private MovieInfo findExact(Node x, String key) { 
    if (x == null) return null; 
    int cmp = key.compareToIgnoreCase(x.movie.fullName); 
    if  (cmp < 0) return findExact(x.left, key); 
    else if (cmp > 0) return findExact(x.right, key); 
    else    return x.movie; 
} 

    public void insert(MovieInfo data) 
    { 
     if (data == null) {return; } 
     root = insert(root, data); 
    } 

    public Node insert(Node x, MovieInfo data) 
    { 
     if (x == null) return new Node(data); 
     int cmp = data.ID - x.movie.ID; 
     if (cmp > 0)  x.right = insert(x.right, data); 
     else if (cmp < 0) x.left = insert(x.left, data); 
     else if (cmp == 0) x.movie = data; 
     return x; 
    } 
} 

を作成したクラス -

public class MovieInfo { 
    public String shortName; 
    public String fullName; 
    static int ID; 
    public String key; 

    public MovieInfo(int id, String s, String f) { 
     ID = id; 
     shortName = s; 
     fullName = f; 
    } 
} 

BSTIndex.java編集できませんIndexTester.java

import java.io.FileInputStream; 
import java.io.FileNotFoundException; 
import java.util.Scanner; 


public class IndexTester { 

    // Test program 
    public static void main(String [ ] args) throws FileNotFoundException 
    { 
     BSTIndex t = new BSTIndex(); 
     Scanner scan = new Scanner(new FileInputStream(args[0])); 
     long start = System.currentTimeMillis(); 
     int i=0; 

     while(scan.hasNext()){ 
      String line = scan.nextLine(); 
      String [] fields = line.split("\t"); 
      int id = Integer.parseInt(fields[0].trim()); 
      String shortName = fields[1].trim(); 
      String fullName = fields[2].trim(); 
      MovieInfo info = new MovieInfo(id, shortName, fullName); 

      t.insert(info); 
      i++; 
      if(i % 10000 == 0){ 
       System.out.println("Inserted " + i + " records."); 
      } 
     } 
     long end = System.currentTimeMillis(); 
     System.out.println("Index building complete. Inserted " + i + 
      " records.Elapsed time = " + (end - start)/1000 + " seconds."); 

     Scanner input = new Scanner(System.in); 

     System.out.println("Enter search string, end in a '*' for 
      prefix search. q to quit"); 
     while(input.hasNext()){ 
      String search = input.nextLine().trim(); 
      if(search.equals("q")) break; 
      if(search.indexOf('*')>0){ 
       //call prefix search. 

       MovieInfo item = t.findPrefix(search); 
       if(item==null) System.out.println("Not Found"); 
       else System.out.println(item.ID + " " + item.shortName + " 
          " + item.fullName); 

      } 
      else{ 
       //call exact search, modify to return MovieInfo 
       MovieInfo item = t.findExact(search); 
       if(item==null) System.out.println("Not Found"); 
       else System.out.println(item.ID + " " + item.shortName + " 
          " + item.fullName); 
      } 
     } 


    } 
} 

答えて

0

public class BSTIndexはMovieInfoを拡張すべきではありません.FindInfoはNodeを拡張するのが望ましいです。

いいえ、MovieInfoは変更できません。そのため、MovieInfoクラスにデータを設定し、拡張Nodeクラスのノード値として設定します。

public class BSTNode extends Node { 
    private BSTNode left,right; 
    private MovieInfo val; 

    public void setVal(MovieInfo val){ 
     this.val=val; 
    } 

    public void setLeft(MovieInfo m){ 
     left=new BSTNode(m); 
    } 
    public void setRight(MovieInfo m){ 
     right=new BSTNode(m); 
    } 
    //override some of the Node methods 
} 
+0

割り当ての一部として、私はMovieInfo.javaファイルを編集できません。代わりに私のパブリッククラスのNodeでそれがMovieInfoを拡張すると言うべきだと思いますか?または、これを行う別の方法がありますか?私が変更を加えた可能性がある場合、私はMovieInfo.java内でget()メソッドを使用していましたが、残念ながら私はできません。 – ns1

+0

私はこれを行うとき、 "暗黙のスーパーコンストラクタBSTIndex.Node()は定義されていません。他のコンストラクタを明示的に呼び出さなければなりません"というpublic BSTNode(MovieInfo val)何か案は? – ns1

+0

上記のコードを更新しました。コンストラクタを削除し、setValメソッドを追加します。 – eabraham