2017-08-11 100 views
1

此刻,我将方法reader.nextInt()调用两次,因此它仅对每个其他值使用addNumber()方法,而不是每个值。需要调用扫描器方法read.nextInt()两次,但要求两个值相同

我该如何解决这个问题?

我试过使用while循环包含(true)以及下面打印的,都遇到相同的问题。

我忘了提,我需要程序打印输入的所有整数的总和。这是通过输入-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

[Scanner在使用next(),nextInt()或其他nextFoo()之后跳过nextLine()?](https://stackoverflow.com/questions/13102045/scanner-is-skipping-nextline-after- using-next-nextint-or-other-nextfoo) –

+0

@KenReid你在哪看到这两个问题之间的联系? – Tom

回答

2

要调用两次nextInt(),因此阅读量拟合选取一前一后。

你可以做你想做这样的东西:

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

这使得使用的事实,即赋值表达式(这一点:num = reader.nextInt())不仅并将值num,但ASLO评估为被分配值,以便我们可以将其与-1进行比较。

+0

你祝福亲切的人,我可以吻你,谢谢! –

+0

@DanielCutter如果您认为答案可以解答您的问题,请考虑点击该选中标记来接受答案! – Sweeper

+0

@Sweeper你应该添加一个关于发生了什么的简短解释恕我直言,这将更清楚如果有人检查它! :D无论如何得到你的upvote,你比我更快:( – Nathan

2

这里的问题是,扫描仪将跳转到下一个令牌的nexInt()每次调用,这就是为什么你会得到下面的编号,而跳过预期之一。

所以不要在你的while条件中使用nextInt(),使用hasNextInt()代替。

所以,你的代码应该是这样的:

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

或者,也可以将结果保存在变量中,以绕过调用'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 

所以你正在阅读他们两个两个。你可以通过这样做来纠正:

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

这样,Reader#nextInt方法只被调用一次。