2012-03-06 13 views

risposta

101

Stai cercando qualsiasi classe che implementa il Queue interface, escluso PriorityQueue e PriorityBlockingQueue, che non utilizzano un algoritmo FIFO.

Probabilmente uno LinkedList utilizzando add (aggiunge uno alla fine) e removeFirst (rimuove uno dal fronte e lo restituisce) è il più semplice da utilizzare.

Per esempio, ecco un programma che utilizza un LinkedList fare la fila e recuperare le cifre del 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(); 
    } 
} 

In alternativa, se si sa desideri solo trattarlo come una coda (senza le funzionalità aggiuntive di una lista collegata), si può semplicemente utilizzare l'interfaccia Queue stesso:

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(); 
    } 
} 

Questo ha il vantaggio di un che ti consente di sostituire la classe concreta sottostante con qualsiasi classe che fornisce l'interfaccia Queue, senza dover modificare troppo il codice.

Le modifiche di base sono per cambiare il tipo di fifo ad un Queue e di utilizzare remove() anziché removeFirst(), quest'ultimo essendo disponibile per l'interfaccia Queue.

La chiamata isEmpty() è ancora accettabile poiché appartiene all'interfaccia Collection di cui Queue è un derivato.

+2

Perché non fare in modo che sia di tipo Coda quindi? Indirizzare l'interfaccia piuttosto che l'implementazione concreta. –

+0

@Adam, buon punto, l'ho previsto come alternativa. – paxdiablo

+0

Se si desidera solo eseguire iterazioni sugli elementi nella coda in un modo FIFO senza rimuovere effettivamente gli elementi, è sufficiente eseguire 'for (Oggetto oggetto: coda)', e itererà su di essi in modo FIFO, a almeno su JDK 7 e con 'ArrayDeQueue' e' LinkedList' impl. –

16

Provare ArrayDeque o LinkedList, che entrambi implementano l'interfaccia Queue.

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

+0

Sì, ArrayDeque e LinkedList hanno il metodo .push di Deque, che è ciò che lo rende utilizzabile come Stack per FIFO. ArrayDeque è più simile a un array primitivo da utilizzare come buffer mentre LinkedList è più simile a un archivio dati. – djangofan

+0

lo stack @djangofan è lifo –

2

Queue s sono First In First Out strutture. La tua richiesta è piuttosto vaga, ma suppongo che tu abbia bisogno solo della funzionalità di base che di solito viene fuori con le strutture di Queue. Puoi dare un'occhiata a come puoi implementarlo here.

Per quanto riguarda il pacchetto mancante, è molto probabile perché è necessario scaricare o creare il pacchetto da soli seguendo questo tutorial.

1

Non è necessario per implementare il proprio FIFO coda, basta guardare l'interfaccia java.util.Queue e le sue implementazioni