Впровадження черги на основі FIFO?


78

Мені потрібна проста черга, реалізована FIFO, для зберігання купу ints (я не сильно проти, якщо це загальна реалізація).

Що-небудь вже спечене для мене в java.utilбібліотеці Trove / Guava?


Відповіді:


86

Так. Чергу

LinkedList - найбільш тривіальна конкретна реалізація.


5
Зверніть увагу, що Javadoc перелічує всі реалізації. Також друге посилання над ним наLinkedList
Джон Б

2
LinkedListне є інтерфейсом; це явний клас. З іншого боку, ArrayDequeце часто швидше.
Луїс Вассерман,

Мені не потрібно будь-коли змінювати розмір своєї черги, кількість елементів завжди є постійною.
Раджат Гупта,

Чи існують відмінності між ArrayDeque та ArrayQueue?
Раджат Гупта,

3
Це насправді не відповідає дійсності: згідно з чергою javadoc, це не обов'язково FIFO: docs.oracle.com/javase/7/docs/api/java/util/Queue.html . LinkedList може бути використаний як черга, оскільки замовлення фіксовано.
Пітер Бос

61

Ось приклад коду використання вбудованої черги FIFO в Java:

public static void main(String[] args) {
    Queue<Integer> myQ = new LinkedList<Integer>();
    myQ.add(1);
    myQ.add(6);
    myQ.add(3);
    System.out.println(myQ);   // 1 6 3
    int first = myQ.poll();    // retrieve and remove the first element
    System.out.println(first); // 1
    System.out.println(myQ);   // 6 3
}

14

ArrayDequeце, мабуть, найшвидша об'єктна черга в JDK; Trove має TIntQueueінтерфейс, але я не знаю, де живуть його реалізації.


8
Щоб ArrayDequeфункціонувати як черга (FIFO), а не стек (LIFO), вам слід використовувати addі remove. Якщо ви використовуєте pushі pop, він поводиться як стек. (Строго кажучи, removeі popоднакові, але оскільки пари звучать add/popабо push/removeне звучать добре, ми йдемо з add/removeта push/pop.)
ADTC

5

Queue- це інтерфейс, який розширюється Collectionв Java. Він має всі функції, необхідні для підтримки FIFOархітектури.

Для конкретного втілення ви можете використовувати LinkedList. LinkedList реалізує, Dequeщо в свою чергу реалізує Queue. Все це є частиною java.utilпакету.

Для отримання детальної інформації про метод із зразком прикладу ви можете звернутися до реалізації черги на основі FIFO в Java .

PS: Вище посилання йде на мій особистий блог, де є додаткові відомості про це.


4

LinkedList може бути використаний в якості черзі - але ви повинні використовувати його правильно. Ось приклад коду:

@Test
public void testQueue() {
    LinkedList<Integer> queue = new LinkedList<>();
    queue.add(1);
    queue.add(2);
    System.out.println(queue.pop());
    System.out.println(queue.pop());
}

Вихід:

1
2

Пам'ятайте , якщо ви використовуєте push замість add (що ви, швидше за все, будете робити інтуїтивно), це додасть елемент в передній частині списку, змушуючи його поводитися як стек.

Отже, це Черга, лише якщо вона використовується разом із add.

Спробуйте це :

@Test
public void testQueue() {
    LinkedList<Integer> queue = new LinkedList<>();
    queue.push(1);
    queue.push(2);
    System.out.println(queue.pop());
    System.out.println(queue.pop());
}

Вихід:

2
1
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.