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

时间:2019-04-14 10:13:04

标签: java collections arraydeque

任务是编写一个读取数字并将其存储到双端队列的程序。

样本输入为: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。 即不正确。

为什么以不同的方式输入相同的容量会得到不同的结果?

1 个答案:

答案 0 :(得分:2)

这与您如何通过容量没有太大关系。它与循环内调用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()) {
   ...