2017-02-19 3 views
1

Я создал DEQUEUE, как follwsПочему addLast() не работает должным образом

Deque<Integer> deque = new ArrayDeque<Integer>(8); 

// use add() method to add elements in the deque 
deque.add(20); 
deque.add(30); 
deque.addLast(12); 
deque.add(18);   
deque.addFirst(22); 
deque.add(24); 

// let us print all the elements available in deque 
for (Integer number : deque) { 
    System.out.println("Number = " + number); 
} 

Ожидаемый результат:

Number = 22 
Number = 20 
Number = 30 
Number = 18 
Number = 24 
Number = 12 

Но фактический выход:

Number = 22 
Number = 20 
Number = 30 
Number = 12 
Number = 18 
Number = 24 

Любой пожалуйста объясните это?

+1

Что вы думаете 'addLast()' делает? Почему ты так думаешь? – shmosel

+1

Не могли бы вы ** объяснить, почему вы ожидали этого вывода? –

ответ

2

Кто-нибудь, пожалуйста, объясните это?

Вы вызвали addLast, когда в очереди было всего 2 элемента. Поэтому элемент передается addLast был добавлен в позиции 3.

Если вы хотите 12 быть добавлены к концу Dequeue, вызовите addLast после добавления 24 к Dequeue

5

addLast не каким-то образом поддерживать понятие «это должно быть последним» навсегда - оно просто добавляет к концу текущего детектора. Это эквивалентно add, as documented.

Так что, если мы посмотрим на значения на каждом шаге мы имеем:

deque.add(20);  // Contents: 20 
deque.add(30);  // Contents: 20, 30 
deque.addLast(12); // Contents: 20, 30, 12 
deque.add(18);  // Contents: 20, 30, 12, 18 
deque.addFirst(22); // Contents: 22, 20, 30, 12, 18 
deque.add(24);  // Contents: 22, 20, 30, 12, 18, 24 

... который точно соответствует выходному сигналу вы получили.

3

Метод addLast добавляет к последней позиции по отношению к текущего Deque, не совсем:

deque.add(20);  // [20] 
deque.add(30);  // [20, 30] 
deque.addLast(12); // [20, 30, 12] <- 12 is last 
deque.add(18);  // [20, 30, 12, 18] 
deque.addFirst(22); // [22, 20, 30, 12, 18] 
deque.add(24);  // [22, 20, 30, 12, 18, 24] 

12 был последним элементом, когда вы только имели [20, 30], но тогда вы добавляете другие элементы, так что это больше не будет последним.

Итак, если вы хотите, чтобы это значение было последним, вам необходимо позвонить addLast после всех других вызовов.

UPDATE

Если вы посмотрите на исходный код ArrayDeque:

public boolean add(E e) { 
    addLast(e); 
    return true; 
} 

Таким образом, addLast делает то же самое, как add: Он добавляет в конце тока deque, что означает, что после добавления других элементов один добавленный с addLast больше не будет последним.

+0

* Таким образом, addLast делает то же самое, что и add *. Разве это не должно быть наоборот? – CKing

+0

@CKing С кодовой точки зрения да, это наоборот. С логической точки зрения, это то же самое понятие: два метода делают то же самое. – BackSlash

+0

@BackSlash Если add() и addLast() эквивалентны, то каково предложение этих двух методов? –

1

Это связано с тем, что, как указано в JAVA Doc, addLast и add эквивалентны: addLast(E e). Следовательно, считайте, что вы просто добавляете 12 к deque. Добавление другого целого в deque не гарантирует, что 12 должен быть последним элементом всегда.

1

Я пытаюсь объяснить порядок событий,

1. 1st addition : 20  
2. 2nd addition: 20, 30 
3. 3rd addition: 20, 30, 12 -- 12 added to the last 
4. 3rd addition: 20, 30, 12 
5. 4th addition: 20, 30, 12, 18 
6. 5th addition: 22, 20, 30, 12, 18 -- 22 added to the first 
7. 6th addition: 22, 20, 30, 12, 18, 24 

Надежда, что объясняет

Смежные вопросы