ArrayDeque<>(int capacity) - Scanner.nextInt() == 4 和 (int) 4 之间有什么区别?
ArrayDeque<>(int capacity) - what's the difference between Scanner.nextInt() == 4 and (int) 4?
任务是编写一个读取数字并将其存储到双端队列的程序。
示例输入为:4 1 2 3 4
示例输出:4 2 1 3
应将偶数添加为第一个元素,将奇数添加为最后一个。之后,程序必须输出从第一个到最后一个的所有元素。
这是我的一段代码:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt());
while (sc.hasNext()) {
int nextInt = sc.nextInt();
if (nextInt % 2 == 0) {
deque.addFirst(nextInt);
} else deque.addLast(nextInt);
}
for (int elt : deque) {
System.out.println(elt);
}
}
}
示例输出:4 2 1 3
它工作正常,它是正确的。但是!
让我们重写
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
作为
Deque<Integer> deque = new ArrayDeque<>(4)
对于这一个,示例输出为:4 2 4 1 3 。
也就是说,这是不正确的。
为什么输入相同的容量不同的方式会得到如此不同的结果?
这个跟你怎么传容量没多大关系。它更多地与循环内调用 Scanner.nextInt
的次数有关。
因为总是有 5 个输入,第一个输入总是大小,如果你这样做
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
sc.nextInt
将总共被调用 5 次(因为您有 5 个输入),在循环内调用 4 次,在上面的行中调用 1 次,因此将向双端队列添加 4 个数字。这是正确的。
如果你这样做了:
Deque<Integer> deque = new ArrayDeque<>(4)
sc.nextInt
将在循环内被调用 5 次,因此 5 个数字将被添加到双端队列中。但是实际上不应该将第一个数字添加到双端队列中,因为它是大小,因此会产生错误的输出。
ArrayDeque
可调整大小,因此您实际上不需要指定大小,您的代码仍然有效。
您可以通过在循环之前调用 sc.nextInt
来忽略第一个输入:
sc.nextInt();
while (sc.hasNextInt()) {
...
任务是编写一个读取数字并将其存储到双端队列的程序。
示例输入为:4 1 2 3 4 示例输出:4 2 1 3
应将偶数添加为第一个元素,将奇数添加为最后一个。之后,程序必须输出从第一个到最后一个的所有元素。
这是我的一段代码:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.Scanner;
public class Main {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt());
while (sc.hasNext()) {
int nextInt = sc.nextInt();
if (nextInt % 2 == 0) {
deque.addFirst(nextInt);
} else deque.addLast(nextInt);
}
for (int elt : deque) {
System.out.println(elt);
}
}
}
示例输出:4 2 1 3
它工作正常,它是正确的。但是!
让我们重写
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
作为
Deque<Integer> deque = new ArrayDeque<>(4)
对于这一个,示例输出为:4 2 4 1 3 。 也就是说,这是不正确的。
为什么输入相同的容量不同的方式会得到如此不同的结果?
这个跟你怎么传容量没多大关系。它更多地与循环内调用 Scanner.nextInt
的次数有关。
因为总是有 5 个输入,第一个输入总是大小,如果你这样做
Deque<Integer> deque = new ArrayDeque<>(sc.nextInt())
sc.nextInt
将总共被调用 5 次(因为您有 5 个输入),在循环内调用 4 次,在上面的行中调用 1 次,因此将向双端队列添加 4 个数字。这是正确的。
如果你这样做了:
Deque<Integer> deque = new ArrayDeque<>(4)
sc.nextInt
将在循环内被调用 5 次,因此 5 个数字将被添加到双端队列中。但是实际上不应该将第一个数字添加到双端队列中,因为它是大小,因此会产生错误的输出。
ArrayDeque
可调整大小,因此您实际上不需要指定大小,您的代码仍然有效。
您可以通过在循环之前调用 sc.nextInt
来忽略第一个输入:
sc.nextInt();
while (sc.hasNextInt()) {
...