使用扫描程序Java的偶数和奇数

时间:2016-02-01 19:59:54

标签: java java.util.scanner

我尝试只向ArrayList添加偶数。在我看来,我使用扫描仪作为最合适的工具。应该在控制台中写入文件的路径。另外,我使用2种最常用的方法来定义偶数。 问题是 - 不仅偶数正在添加到我的ArrayList。 有我的代码:

BufferedReader bfReader = new BufferedReader(new InputStreamReader(System.in));
InputStream inputStream = null;
List<Integer> myInts = new ArrayList<Integer>();

String filePath = null;
try {
  filePath = bfReader.readLine();
  inputStream = new FileInputStream(filePath);
} catch (IOException e) { }

Scanner scanner = new Scanner(inputStream);
while (scanner.hasNext()) {
  if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1) 
    myInts.add(scanner.nextInt());
  // if ((scanner.nextInt() & 1) == 0)
  //   myInts.add(scanner.nextInt());
}

for (Integer x : myInts) {
  System.out.println(x);
}

我想我误解了Scanner的一些事情 很高兴收到任何答案!

6 个答案:

答案 0 :(得分:3)

原因是每次nextInt()的新调用都会从输入中读取新的整数。

以下是经过修改的代码段,说明了您可能要尝试的内容:

Scanner scanner = new Scanner(inputStream);
int myInt;

while (scanner.hasNext()) {
  myInt = scanner.nextInt();

  if ((myInt % 2) == 0 && myInt != 1) 
    myInts.add(myInt);
}

有关详细信息,请查看docs

答案 1 :(得分:2)

每次时间调用nextInt,都需要扫描一个项目。这意味着一次通过循环会删除多达三个项目,并且添加的项目与您正在进行检查的项目不同。

想象一下,您的输入是4 3 1

您的代码将执行此操作:

if ((scanner.nextInt() /* 4 */ % 2) == 0 && scanner.nextInt() /* 3 */ != 1) 
    myInts.add(scanner.nextInt() /* 1 */);

并将1添加到您的列表中。

您应该将代码更改为:

while (scanner.hasNext())
{
    int value = scanner.nextInt();
    if ((value % 2) == 0) 
        myInts.add(value);
}

这只会读取一个值,并在所有比较中使用它。

答案 2 :(得分:1)

这里的问题在于

scanner.nextInt()

每次拨打 while (scanner.hasNext()) { int i = scanner.nextInt; if ((i % 2) == 0 && i != 1) myInts.add(i); } 时,都会使用下一个输入。因此,您最终会丢弃大部分输入。要解决此问题,您需要具备类似

的内容
belongsTo

这将正确消耗输入并且应该正常工作。 包含此信息的扫描仪javadoc可在此处找到:https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

答案 3 :(得分:1)

是的我认为你理解错了。每当你使用scanner类指针的nextInt()方法时,扫描文件将移动到nextInt()。因此最好将该整数值保存在临时变量中。以下是代码的修改,

BufferedReader bfReader = new BufferedReader(new InputStreamReader(System.in));
    InputStream inputStream = null;
    List<Integer> myInts = new ArrayList<Integer>();

    String filePath = null;
    try
    {
        filePath = bfReader.readLine();
        inputStream = new FileInputStream(filePath);
    }
    catch (IOException e)
    {
    }

    Scanner scanner = new Scanner(inputStream);
    while (scanner.hasNext())
    {
        int firstNumber = scanner.nextInt();

        if ((firstNumber % 2) == 0 && firstNumber != 1) 
            myInts.add(firstNumber);
      //if ((scanner.nextInt() & 1) == 0)
      //    myInts.add(scanner.nextInt());
    }
    for (Integer x : myInts)
    {
        System.out.println(x);
    }

答案 4 :(得分:0)

每次拨打while (scanner.hasNext()) { int n = scanner.nextInt(); if (n%2 == 0) { myInts.add(n); } } 时,您都会收到另一个号码。如果要多次引用相同的数字,请分配给变量。

此外,检查过一个数字是否均匀后,您也不必检查它是否为数字1。

if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1) 

答案 5 :(得分:-1)

在第

if ((scanner.nextInt() % 2) == 0 && scanner.nextInt() != 1)

您正在从输入中读取两个整数,而不是两次检查相同的整数:

int nextInt = scanner.nextInt();
if ((nextInt % 2) == 0 && nextInt != 1)