ArrayDeque<>(int capacity) - Scanner.nextInt() == 4 和 (int) 4 有什么区别?



任务是编写一个程序来读取数字并将其存储到deque中。

示例输入为: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 中。这是正确的。

但是,如果您这样做:

Deque<Integer> deque = new ArrayDeque<>(4)

sc.nextInt将在循环内被调用 5 次,因此 5 个数字将被添加到 Deque 中。但是第一个数字实际上不应该添加到 Deque 中,因为它是大小,因此会产生错误的输出。

ArrayDeque 是可调整大小的,因此您实际上不需要指定大小,您的代码仍然可以工作。

您可以通过在循环之前调用sc.nextInt来忽略第一个输入:

sc.nextInt();
while (sc.hasNextInt()) {
   ...

最新更新