Класс FIFO на Java - PullRequest
       5

Класс FIFO на Java

56 голосов
/ 06 марта 2012

Я хочу реализовать FIFO через класс в Java.

Такой класс уже существует?Если нет, как я могу реализовать свой собственный?

ПРИМЕЧАНИЕ

Я нашел здесь класс http://www.dcache.org/manuals/cells/docs/api/dmg/util/Fifo.html,, но он не содержит dmg.util.*.Я не знаю, существует ли такой пакет.

Ответы [ 6 ]

111 голосов
/ 06 марта 2012

Вы ищете любой класс, который реализует интерфейс Queue , исключая PriorityQueue и PriorityBlockingQueue, которые не используют алгоритм FIFO.

Вероятно, LinkedList с использованием add (добавляет один в конец) и removeFirst (удаляет один спереди и возвращает его) является самым простым в использовании.

Например, вот программа, которая использует LinkedList для постановки в очередь и получения цифр PI:

import java.util.LinkedList;

class Test {
    public static void main(String args[]) {
        char arr[] = {3,1,4,1,5,9,2,6,5,3,5,8,9};
        LinkedList<Integer> fifo = new LinkedList<Integer>();

        for (int i = 0; i < arr.length; i++)
            fifo.add (new Integer (arr[i]));

        System.out.print (fifo.removeFirst() + ".");
        while (! fifo.isEmpty())
            System.out.print (fifo.removeFirst());
        System.out.println();
    }
} 

В качестве альтернативы, если вы знаете , вы хотите рассматривать его только как очередь (без дополнительных функций связанного списка), вы можете просто использовать сам интерфейс Queue:

import java.util.LinkedList;
import java.util.Queue;

class Test {
    public static void main(String args[]) {
        char arr[] = {3,1,4,1,5,9,2,6,5,3,5,8,9};
        Queue<Integer> fifo = new LinkedList<Integer>();

        for (int i = 0; i < arr.length; i++)
            fifo.add (new Integer (arr[i]));

        System.out.print (fifo.remove() + ".");
        while (! fifo.isEmpty())
            System.out.print (fifo.remove());
        System.out.println();
    }
}

Преимущество этого состоит в том, что вы можете заменить базовый конкретный класс любым классом, предоставляющим интерфейс Queue, без необходимости слишком сильно изменять код.

Основные изменения: изменить тип fifo на Queue и использовать remove() вместо removeFirst(), причем последнее недоступно для интерфейса Queue.

Вызов isEmpty() все еще в порядке, поскольку он относится к интерфейсу Collection, производным которого является Queue.

17 голосов
/ 06 марта 2012

Попробуйте ArrayDeque или LinkedList, которые оба реализуют интерфейс Queue.

http://docs.oracle.com/javase/6/docs/api/java/util/ArrayDeque.html

2 голосов
/ 06 марта 2012

Очередь s - это структуры First In First Out. Ваш запрос довольно расплывчатый, но я предполагаю, что вам нужна только базовая функциональность, которая обычно поставляется со структурами очереди. Вы можете взглянуть на то, как вы можете реализовать это здесь .

Что касается отсутствующего пакета, скорее всего, потому что вам нужно будет либо загрузить, либо создать пакет самостоятельно, следуя этому руководству.

1 голос
/ 06 марта 2012

если вы хотите иметь канал для записи / чтения данных, вы можете использовать http://docs.oracle.com/javase/6/docs/api/java/io/PipedWriter.html

1 голос
/ 06 марта 2012

Вам не нужно реализовывать собственную очередь FIFO, достаточно взглянуть на интерфейс java.util.Queue и его реализации

0 голосов
/ 26 ноября 2014

Вы можете использовать LinkedBlockingQueue Я использую его в своих проектах.Это часть стандартного Java и довольно простой в использовании

...