2016-10-22 4 views
0

赤の黒いツリーを作成し、ツリーの赤いノードの割合を決定するプログラムを作成しました。今私はそれのための主要な方法を作っています。私がやろうとしている何入力ループの状態を変更すると入力値の半分がスキップされる

public static void main(String[] args) { 
    Scanner s; 
    if (args.length > 0){ 
     try{ 
      s = new Scanner(new File(args[0])); 
     } catch(java.io.FileNotFoundException e){ 
      System.out.printf("Unable to open %s\n",args[0]); 
      return; 
     } 
     System.out.printf("Reading input values from %s.\n",args[0]); 
    } else { 
     s = new Scanner(System.in); 
     System.out.printf("Enter a list of non-negative integers. Enter a negative value to end the list.\n"); 
    } 
    RedBlackBST<String, Integer> st = new RedBlackBST<String, Integer>(); 
    int i = 0; 
    while ((s.hasNextInt())){ 
     int key = s.nextInt(); 
     st.put(key, i); 
     i++; 
    } 
    double percent = percentRed(); 
    System.out.println("There are " + redcount + " red nodes so"); 
    System.out.println(percent + "% of the nodes are red"); 
    } 

整数のファイルのいずれかに基づいてツリーを作成(ユーザが「JavaのRedBlackBSTのtest10.txt」と入力してプログラムを実行した場合である:だから、ここで私が今持っているものですツリーに挿入するための10個の値が含まれています)、またはユーザーがファイルを指定していない場合は、ユーザーが自分の値を入力し、最後に負の値を入力してリストを終了するように求めます。あなた自身の値を入力するのは機能しませんが、数字の.txtファイルを渡すと、意図したとおりに正しく動作します。今、独自の値を入力するためとして、私はこのように見えるようにwhileループを変更することを考えていた:

while ((s.hasNextInt()) && (s.nextInt()) >= 0){ 

だから、これが行うことになっているもの、あなたが負の値をヒットした場合、値のリストを通過していますリスト内で値の読み取りを停止します。この問題は何らかの理由で(たとえファイルを渡しても)整数の配列の値の半分しか読み込まないということです。だから、whileループを変更すると、プログラムは配列の値の半分しか読み込まないようになりましたか?

また、私が呼んでいるputメソッドは、値をツリーに挿入する挿入メソッドです。

答えて

1

あなたのループは、のように見える終わるだろう、あなたは文字通りあなたが言及した正確な変更を行ったと仮定:nextInt()として当然のことながら、他のすべての値をスキップされ、反復二回nextInt()を呼び出し

while ((s.hasNextInt()) && (s.nextInt()) >= 0){ 
    int key = s.nextInt(); 
    st.put(key, i); 
    i++; 
} 

は、入力を消費します。 、反復ごとに1 nextInt()をこのように

int key; 
while ((s.hasNextInt()) && (key = s.nextInt()) >= 0){ // <- key is assigned *and* tested 
    st.put(key, i); 
    i++; 
} 

:ここ

一つの典型的なアプローチは、あなたが条件の範囲内で利用できる持っているので、その後、ループの外keyを宣言割り当てると同様に、一度にすべてをテストすることです。

+0

しかし、キーがループの外側に宣言されていて、内部に何もない場合、キーが初期化されていないというエラーが表示されます。 –

+0

@davidmahループの後に何かのために 'key'を使用しようとすると、そのエラーだけが出ます。あなたですか? –

+0

よくwhileループで私は何かにキーが割り当てられていない場合、問題を引き起こす赤い黒のツリーにキーを挿入する私の挿入メソッドを呼び出しています。私は、スキャナの最初の値に割り当てられたキーを取得できればうまくいくと思います。 –

関連する問題