Java'da bir Queue nesnesini nasıl başlatırım?


142

Denediğimde:

Queue<Integer> q = new Queue<Integer>();

derleyici bana bir hata veriyor. Herhangi bir yardım?

Ayrıca, bir kuyruk başlatmak istiyorsanız, kuyruk yöntemlerini uygulamak zorunda mıyım?


2
İş parçacığının güvenli olması için kuyruğa ihtiyacınız var mı?
Peter Lawrey

Yanıtlar:


151

A Queuebir arayüzdür, yani Queuedoğrudan inşa edemezsiniz .

En iyi seçenek zaten uygulayan bir sınıf kapalı oluşturmaktır Queueaşağıdakilerden biri gibi, arayüz: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, veya SynchronousQueue.

Bir alternatif, gerekli Queue arayüzünü uygulayan kendi sınıfınızı yazmaktır. Programınızın geri kalanına a sağlarken özel bir şey yapmak istediğiniz nadir durumlar dışında gerekli değildir Queue.

public class MyQueue<T extends Tree> implements Queue<T> {
   public T element() {
     ... your code to return an element goes here ...
   }

   public boolean offer(T element) {
     ... your code to accept a submission offer goes here ...
   }

   ... etc ...
}

Daha az kullanılan bir alternatif, uygulayan anonim bir sınıf oluşturmaktır Queue. Muhtemelen bunu yapmak istemezsiniz, ancak tüm üsleri kapsamak için bir seçenek olarak listelenir.

new Queue<Tree>() {
   public Tree element() {
     ...
   };

   public boolean offer(Tree element) {
     ...
   };
   ...
};

21
Ah canım ... Bunu okuyan birinin anonim kullanacağından korkuyorum Queue... ama yine de +1.
Tom

1
Aslında Jon daha açıktır. Eşzamanlılıktan bahsetmek ve anonim sınıflar için koddan kurtulmak için güncellerseniz bunu + 1'leyeceğim ... Sanırım cevabı ne yapacağını bilmek isteyen biri için daha kafa karıştırıcı hale getiriyor çünkü neredeyse kesinlikle istemiyorlar yap bunu. (Kendi sınıflarını isteseler bile, anonim hale getirmeye gerek yoktur)
Tom

1
@Tom, anonim sınıf bilgilerini mümkün olduğunu bilmek iyi olduğu için almadı, ancak ilk listelenen (daha yaygın) alternatiflerden daha uzak olan mesafeleri "Kendi uygulamanızı yazın" ı koydum.
Edwin Buck

1
Neden bahsetmiyorumArrayDeque
JW.ZG

Bahsettiğiniz sınıfların herhangi birinde enqueue () yöntemini bulamıyorum, yalnızca add () yöntemini bulabiliyorum, yanlışsam lütfen beni düzeltin.
Sreekanth Karumanaghat

152

Queuebir arayüzdür. Anonim bir iç sınıf dışında doğrudan bir arabirim başlatamazsınız. Genellikle bu bir koleksiyon için yapmak istediğiniz şey değildir . Bunun yerine mevcut bir uygulamayı seçin. Örneğin:

Queue<Integer> q = new LinkedList<Integer>();

veya

Queue<Integer> q = new ArrayDeque<Integer>();

Genellikle, ilgilendiğiniz performans ve eşzamanlılık özelliklerine göre bir koleksiyon uygulaması seçersiniz.


9
Gönderen ArrayDeque : "Bu sınıf bir sıra olarak kullanıldığında bir yığın olarak kullanılan ve daha hızlı LinkedList daha daha hızlı Yığın daha olması muhtemeldir". CPU önbellek dostu veri konumu ve daha az sıklıkta ayırma nedeniyle.
Vadzim

42
Queue<String> qe=new LinkedList<String>();

qe.add("b");
qe.add("a");
qe.add("c");

Yana Queuebir arayüz size gösterildiği gibi, bunun bir örneğini oluşturamazsınız


1
java.util.Queuebir arayüzdür. Arayüzleri başlatamazsınız. Bu arabirimi uygulayan bir sınıf örneği oluşturmanız gerekir. Bu durumda LinkedList böyle bir sınıftır.
Mihai Toader

@ Evet evet yoldaydı .. :)
Jigar Joshi

Teşekkürler @JigarJoshi !! yığın ile aynı şeyi yapmanın bir yolu var mı? Hiçbir şey bulamadım.
Zehra Subaş

ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
Joshi

15

Kuyruk bir arayüzdür; açıkça bir Kuyruk oluşturamazsınız. Uygulayıcı sınıflarından birini başlatmanız gerekecek. Gibi bir şey:

Queue linkedList = new LinkedList();

İşte bu konuyla ilgili Java eğitimine bir bağlantı.


bu artık çalışmıyor ..! Bu bildirim çalışıyor olsa da -> Kuyruk <Character> kuyruk = new ArrayDeque <Character> ();
Md Faisal

@MdFaisal Java sürümü "1.7.0_71" ile benim için iyi çalışıyor
zmf

12

resim açıklamasını buraya girin

Queue arabirimi java.util.Collection dosyasını ek ekleme, çıkarma ve inceleme işlemleriyle genişletir:

+offer(element: E):boolean // Öğe ekleme

+poll(): E // Öğeyi alır ve sıra boşsa NULL döndürür

+remove(): E// Öğeyi alır ve kaldırır ve sıra boşsa bir İstisna atar

+peek(): E// Bu kuyruğun başını alır, ancak kaldırmaz, bu kuyruk boşsa null değerini döndürür.

+element(): E// Bu sıranın başını alır, ancak kaldırmaz, bu sıra boşsa bir istisna atar.

Kuyruğu uygulamak için Örnek Kod:

java.util.Queue<String> queue = new LinkedList<>();
queue.offer("Hello");
queue.offer("StackOverFlow");
queue.offer("User");

System.out.println(queue.peek());

while (queue.size() > 0){
    System.out.println(queue.remove() + " ");
}
//Since Queue is empty now so this will return NULL
System.out.println(queue.peek());

Kod Çıkışı:

Hello
Hello 
StackOverFlow 
User 
null

7

Sıra Java bir arayüz, bunu yapamazsınız.

Bunun yerine iki seçeneğiniz var:

seçenek 1:

Queue<Integer> Q = new LinkedList<>();

seçenek 2:

Queue<Integer> Q = new ArrayDeque<>();

Diğerlerinden biraz daha hızlı olduğu için option2'yi kullanmanızı öneririm


5

Java'da kuyruk bir arabirim olarak tanımlanır ve birçok kullanıma hazır uygulama JDK sürümünün bir parçası olarak bulunur. Bazıları: LinkedList , Öncelik Kuyruğu, ArrayBlockingQueue, ConcurrentLinkedQueue, Bağlı Transfer Kuyruğu, Senkron Kuyruk vb.

SO Bu sınıflardan herhangi birini oluşturabilir ve Queue referansı olarak tutabilirsiniz. Örneğin

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

public class QueueExample {

 public static void main (String[] args) {
  Queue que = new LinkedList();
  que.add("first");
  que.offer("second");
  que.offer("third");
  System.out.println("Queue Print:: " + que);
  
  String head = que.element();
  System.out.println("Head element:: " + head);
  
  String element1 = que.poll();
  System.out.println("Removed Element:: " + element1);
  
  System.out.println("Queue Print after poll:: " + que);
  String element2 = que.remove();
  System.out.println("Removed Element:: " + element2);
  
  System.out.println("Queue Print after remove:: " + que);  
 }
}

Ayrıca kendi özel Kuyruğu uygulayan Kuyruk arabiriminizi de uygulayabilirsiniz.


4

QueueJava bir arayüz, bunu yapamadı. Deneyin:

Queue<Integer> Q = new LinkedList<Integer>();
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.