2012-03-06 34 views

Trả lời

101

Bạn đang tìm bất kỳ lớp nào triển khai Queue interface, ngoại trừ PriorityQueuePriorityBlockingQueue, không sử dụng thuật toán FIFO.

Có thể là LinkedList sử dụng add (thêm một vào cuối) và removeFirst (xóa một từ phía trước và trả về) là cách dễ nhất để sử dụng.

Ví dụ, đây là một chương trình sử dụng một LinkedList phải xếp hàng và lấy các chữ số của 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(); 
    } 
} 

Ngoài ra, nếu bạn biết bạn chỉ muốn đối xử với nó như một hàng đợi (mà không có tính năng bổ sung của một danh sách liên kết), bạn chỉ có thể sử dụng giao diện Queue bản thân:

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

này có lợi thế là một bạn sẽ thay thế lớp bê tông cơ bản với bất kỳ lớp nào cung cấp giao diện Queue mà không phải thay đổi mã quá nhiều.

Những thay đổi cơ bản là thay đổi kiểu của fifo đến một Queue và sử dụng remove() thay vì removeFirst(), sau này là không có sẵn cho giao diện Queue.

Gọi isEmpty() vẫn ổn vì thuộc về giao diện Collection trong đó Queue là một dẫn xuất.

+2

Tại sao không làm cho nămo là loại Queue sau đó? Nhắm mục tiêu giao diện thay vì triển khai cụ thể. –

+0

@ Adam, điểm tốt, tôi đã cung cấp đó như là một thay thế. – paxdiablo

+0

Nếu bạn chỉ muốn lặp lại các mục trong hàng đợi theo cách thức FIFO mà không thực sự loại bỏ các mục, thì bạn có thể làm 'for (Object item: queue)', và nó sẽ lặp lại chúng theo cách FIFO, tại ít nhất trên JDK 7 và với 'ArrayDeQueue' và' LinkedList' impl. –

16

Hãy thử ArrayDeque hoặc LinkedList, cả hai đều triển khai giao diện Queue.

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

+0

Có, ArrayDeque và LinkedList có phương pháp .push từ Deque, đó là những gì làm cho nó có thể sử dụng như một Stack cho FIFO. ArrayDeque giống như một mảng nguyên thủy để sử dụng như một bộ đệm trong khi LinkedList giống như một kho dữ liệu hơn. – djangofan

+0

@djangofan stack là lifo –

2

Queue s là First In First Out cấu trúc. Bạn yêu cầu là khá mơ hồ, nhưng tôi đoán rằng bạn chỉ cần các chức năng cơ bản mà thường đi kèm với cấu trúc xếp hàng. Bạn có thể xem cách bạn có thể thực hiện nó here.

Đối với gói bị thiếu của bạn, rất có thể là do bạn sẽ cần tải xuống hoặc tự mình tạo gói bằng cách làm theo hướng dẫn đó.

1

Bạn không cần phải thực hiện FIFO Queue riêng của bạn, chỉ cần nhìn vào giao diện java.util.Queue và triển khai nó

Các vấn đề liên quan