2017-08-11 12 views
1

現在、メソッドreader.nextInt()を2回呼び出すため、それぞれ1つではなく他の値に対してaddNumber()メソッドを使用しています。スキャナメソッドread.nextInt()を2回呼び出す必要がありますが、両方に同じ値が必要です

この問題の解決方法を教えてください。

(真)と下に出力されているwhileループを使ってみましたが、どちらも同じ問題が発生しています。

私は入力したすべての整数の合計を印刷するプログラムが必要です。これは、値-1を入力することによってトリガーされます。 -1は合計から除外されることを意味します。

import java.util.Scanner; 

public class Main { 
    public static void main(String[] args) { 
    NumberStatistics stats = new NumberStatistics(); 
    Scanner reader = new Scanner (System.in); 

    System.out.println("Type numbers:"); 

    while (reader.nextInt() != -1) {    
     stats.addNumber(reader.nextInt()); 
    } 

    System.out.println("sum: " + stats.sum()); 

    } 
} 

public class NumberStatistics { 

private int amountOfNumbers; 
private int sum; 

    public NumberStatistics() { 
    amountOfNumbers = 0; 
    sum = 0; 
    } 

    public void addNumber(int number) { 
    this.amountOfNumbers++; 
    this.sum += number; 
    } 

    public int amountOfNumbers() { 
    return this.amountOfNumbers; 
    } 

    public int sum() { 
    return this.sum; 
    } 

    public double average() { 

    if (this.sum() == 0) { 
     return 0; 
    } 
    else { 
     return (double) this.sum/this.amountOfNumbers; 
    } 
    } 
} 
+3

ここにコードを投稿してください。 –

+0

next()、nextInt()またはnextFoo()?(https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after-)を使用した後、[スキャナがnextLine()をスキップしています。 using-next-nextint-or-other-nextfoo) –

+0

@KenReidこれら2つの質問の関連はどこにありますか? – Tom

答えて

2

をあなたはそれ故に nubers次々に読んで、二回nextInt()呼んでいます。

あなたはこのようにやりたいことができます。numに値を代入しますが、aslo値に評価が割り当てられていない場合のみ:

int num; 
while ((num = reader.nextInt()) != -1) { 
    stats.addNumber(num); 
} 

これは、代入式(num = reader.nextInt()これが)という事実を利用しますこれを-1と比較することができます。

+0

あなたは恵まれた男を祝福しました。私はあなたにキスしてくれます。ありがとう! –

+0

@DanielCutter質問に答えがあると思われる場合は、そのチェックマークをクリックして回答を受け入れることを検討してください。 – Sweeper

+0

@スウィーパーあなたがIMHOの状況について簡単に説明してください。 :Dあなたのアップヴォートをとにかく取得すると、あなたは私よりも速くなりました:( – Nathan

2

ここでの問題は、スキャナを使用すると、次の番号を取得する理由ですnexInt()の各呼び出しのために次のトークンにジャンプし、予想される1をスキップしますということです。

だから、あなたの while状態で nextInt()を使用していない hasNextInt()代わりに使用します。

だからあなたのコードは次のようになります。

int next; 
while (reader.hasNextInt() && (next = reader.nextInt()) != -1){ 
    stats.addNumber(next); 
} 
+0

あるいは、変数に結果を保存するだけで、結果に2回目にアクセスするための 'Scanner'メソッドの呼び出しを回避することができます。 – Zabuza

+0

@ Zabuzaはい、おそらく、これはパフォーマンスが低下し、NPEにつながる可能性があります。 –

+1

しかしこれは有効な入力として '-1'を受け取りますが、OPのオリジナルは有効ではありません。 – Sweeper

1

nextInt()を呼び出すと、スキャナのポインタがintを解析し、次の要素に進みます。基本的に、あなたは次のようになります:

pointer 
    | 
    | 
    12345  12346 12347 

while (nextInt() ...) // pointer moves to next int 

      pointer 
      | 
      | 
    12345  12346 12347 

stats.addNumber(reader.nextInt()); // Now the pointer is already at the next one 

したがって、2つずつ読むことになります。

int a; 
while ((a = reader.nextInt()) != -1) 
    stats.addNumber(a); 

このようにして、Reader#nextIntメソッドは1回だけ呼び出されます。

関連する問題