ArrayDeque <> (intacity) - в чем разница между Scanner.nextInt () == 4 и (int) 4? - PullRequest
0 голосов
/ 14 апреля 2019

Задача - написать программу, которая читает числа и сохраняет их в деке.

Пример ввода: 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 Ответ

2 голосов
/ 14 апреля 2019

Это не имеет ничего общего с тем, как вы проходите емкость.Это больше связано с тем, сколько раз 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()) {
   ...
...