我尝试只向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
的一些事情
很高兴收到任何答案!
答案 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)