【问题标题】:ArrayDeque<>(int capacity) - what's the difference between Scanner.nextInt() == 4 and (int) 4?ArrayDeque<>(int capacity) - Scanner.nextInt() == 4 和 (int) 4 有什么区别?
【发布时间】:2019-04-14 10:13:03
【问题描述】:

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

样本输入为: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 。 也就是说,它是不正确的。

为什么以不同方式输入相同容量会产生如此不同的结果?

【问题讨论】:

  • 在第一种情况下,您向用户询问第一个整数并将其用作双端队列的容量。然后将接下来的 4 个整数存储在双端队列中。在第二种情况下,您将所有 5 个整数存储在双端队列中,因为您不再使用第一个作为双端队列的容量……您应该能够自己弄清楚。养成调试代码的习惯,可以使用调试器逐行执行,也可以简单地在代码中添加 println() 语句以了解发生了什么。

标签: java collections arraydeque


【解决方案1】:

这与你如何传递容量没有太大关系。它与循环内调用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 次,因此将向 Deque 添加 5 个数字。但是第一个数字实际上不应该添加到 Deque 中,因为它是大小,因此会产生错误的输出。

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

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

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

【讨论】:

    猜你喜欢
    • 2022-11-27
    • 1970-01-01
    • 1970-01-01
    • 2020-05-05
    • 2015-11-04
    • 1970-01-01
    • 1970-01-01
    • 2014-10-20
    • 2017-02-23
    相关资源
    最近更新 更多