मैं जावा में एक कतार वस्तु को कैसे त्वरित करूं?


142

जब मैं कोशिश करता हूं:

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

संकलक मुझे एक त्रुटि दे रहा है। कोई मदद?

इसके अलावा, अगर मैं एक कतार को शुरू करना चाहता हूं तो क्या मुझे कतार के तरीकों को लागू करना होगा?


2
क्या आपको धागा सुरक्षित होने के लिए कतार की आवश्यकता है?
पीटर लॉरी

जवाबों:


151

A Queueएक इंटरफ़ेस है, जिसका अर्थ है कि आप Queueसीधे निर्माण नहीं कर सकते हैं।

सबसे अच्छा विकल्प एक वर्ग कि पहले से ही लागू करता है बंद का निर्माण करने की है Queueइंटरफ़ेस, निम्न में से एक की तरह: AbstractQueue, ArrayBlockingQueue, ArrayDeque, ConcurrentLinkedQueue, DelayQueue, LinkedBlockingQueue, LinkedList, PriorityBlockingQueue, PriorityQueue, या SynchronousQueue

एक विकल्प अपनी कक्षा लिखना है जो आवश्यक क्यू इंटरफ़ेस को लागू करता है। यह उन दुर्लभ मामलों को छोड़कर आवश्यक नहीं है जहां आप अपने कार्यक्रम के बाकी हिस्सों को प्रदान करते हुए कुछ विशेष करने की इच्छा रखते हैं 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 ...
}

एक और भी कम इस्तेमाल किया जाने वाला विकल्प एक अनाम वर्ग का निर्माण करना है जो लागू करता है Queue। आप शायद ऐसा नहीं करना चाहते हैं, लेकिन यह सभी आधारों को कवर करने के लिए एक विकल्प के रूप में सूचीबद्ध है।

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

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

21
ओह प्रिय ... मुझे डर है कि यह पढ़ने वाला कोई अनाम का उपयोग करेगा Queue... लेकिन +1 वैसे भी।
टॉम

1
वास्तव में, जॉन अधिक स्पष्ट है। मैं इसे +1 करूंगा यदि आप इसे संगामिति का उल्लेख करने और अनाम कक्षाओं के लिए कोड से छुटकारा पाने के लिए इसे अपडेट करते हैं ... मुझे लगता है कि यह किसी ऐसे व्यक्ति के लिए जवाब को और अधिक भ्रमित करता है जो जानना चाहता है कि क्या करना है क्योंकि वे लगभग निश्चित रूप से नहीं करना चाहते हैं वो करें। (यहां तक ​​कि अगर वे अपनी खुद की कक्षा चाहते थे, तो इसे अनाम बनाने की कोई आवश्यकता नहीं है)
टॉम

1
@ टॉम ने अनाम वर्ग की जानकारी को बाहर नहीं निकाला क्योंकि यह जानना अच्छा है कि यह संभव है, लेकिन मैंने इसे "अपना खुद का कार्यान्वयन लिखें" इससे पहले रखा था जो इसे पहले सूचीबद्ध (अधिक सामान्य) विकल्पों से दूर करता है।
एडविन बक

1
क्यों नहीं उल्लेखArrayDeque
JW.ZG

आपके द्वारा बताए गए किसी भी वर्ग में मैं enqueue () विधि नहीं खोज पा रहा हूं, मैं केवल ऐड () विधि ढूंढने में सक्षम हूं, अगर मैं गलत हूं तो कृपया मुझे सही करें।
श्रीकांत करुमनघाट

152

Queueएक इंटरफ़ेस है। अनाम आंतरिक वर्ग को छोड़कर आप सीधे इंटरफ़ेस को बंद नहीं कर सकते। आमतौर पर यह वह नहीं है जो आप संग्रह के लिए करना चाहते हैं। इसके बजाय, एक मौजूदा कार्यान्वयन चुनें। उदाहरण के लिए:

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

या

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

आमतौर पर आप प्रदर्शन और संगामिति विशेषताओं द्वारा एक संग्रह कार्यान्वयन चुनते हैं जिसमें आप रुचि रखते हैं।


9
से ArrayDeque : "यह वर्ग जब तेजी से LinkedList की तुलना में एक ढेर के रूप में इस्तेमाल किया, और जब एक कतार के रूप में इस्तेमाल तेजी से ढेर से होने की संभावना है।" यह सीपीयू-कैश-फ्रेंडली डेटा लोकलिटी और लगातार कम आवंटन के कारण है।
वडज़िम

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

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

चूँकि Queueएक इंटरफ़ेस है, आप उदाहरण के रूप में इसका उदाहरण नहीं बना सकते


1
java.util.Queueएक इंटरफ़ेस है। आप इंटरफेस को तुरंत नहीं कर सकते। आपको उस इंटरफ़ेस को लागू करने वाले वर्ग का एक उदाहरण बनाने की आवश्यकता है। इस मामले में एक लिंक्डलिस्ट ऐसा वर्ग है।
मिहाई टॉडर

@ टोड हाँ रास्ते में था .. :)
जिगर जोशी

धन्यवाद @ जयगढ़ी जोशी !! वहाँ ढेर के साथ एक ही बात करने के लिए कोई रास्ता नहीं है? मुझे कुछ नहीं मिला।
ज़हरा सुबास

@ZehStack<String> stack = new Stack<>(); stack.push("a"); stack.push("b"); System.out.println(stack.pop()); import java.util.Stack;
जिगर जोशी

15

कतार एक इंटरफ़ेस है; आप स्पष्ट रूप से एक कतार का निर्माण नहीं कर सकते। आपको इसके क्रियान्वयन वर्गों में से एक को तत्काल करना होगा। कुछ इस तरह:

Queue linkedList = new LinkedList();

यहाँ इस विषय पर जावा ट्यूटोरियल का लिंक दिया गया है।


यह अब काम नहीं कर रहा है ..! यद्यपि यह घोषणा काम कर रही है -> कतार <वर्ण> कतार = नया एरियरडेक <चरित्र> ();
एमडी फैसल

@MdFaisal मेरे लिए अच्छा काम करता है w / java वर्जन "1.7.0_71"
zmf

12

यहां छवि विवरण दर्ज करें

कतार इंटरफ़ेस अतिरिक्त प्रविष्टि, निष्कर्षण और निरीक्षण कार्यों जैसे java.util.Collection का विस्तार करता है:

+offer(element: E):बूलियन // किसी तत्व को सम्मिलित करना

+poll(): E // तत्व को पुनः प्राप्त करता है और यदि पंक्ति खाली है तो NULL लौटाता है

+remove(): E// पुनर्प्राप्त करता है और तत्व को निकालता है और यदि कतार खाली है तो एक अपवाद फेंकता है

+peek(): E// वापस आ गया है, लेकिन इस कतार का सिर खाली नहीं है, अगर यह कतार खाली है, तो वापस नहीं आता है।

+element(): E// निकालता है, लेकिन निकालता नहीं है, इस कतार का सिर एक अपवाद फेंकता है अगर ते कतार खाली है।

कतार लागू करने के लिए उदाहरण कोड:

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

कोड का आउटपुट:

Hello
Hello 
StackOverFlow 
User 
null

7

कतार जावा में एक इंटरफ़ेस है, आप ऐसा नहीं कर सकते।

इसके बजाय आपके पास दो विकल्प हैं:

विकल्प 1:

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

विकल्प 2:

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

मैं विकल्प 2 का उपयोग करने की सलाह देता हूं क्योंकि यह दूसरे की तुलना में थोड़ा तेज है


5

जावा में कतार को एक इंटरफ़ेस के रूप में परिभाषित किया गया है और कई रेडी-टू-यूज़ कार्यान्वयन JDK रिलीज़ के हिस्से के रूप में मौजूद है। यहाँ कुछ इस प्रकार हैं: लिंक्डलिस्ट , प्रायोरिटी क्यू, अर्रेब्लॉकिंग क्यू, कन्ट्रासेंटलिंकडीक्यू, लिंक्ड ट्रांसफर क्यू, सिंक्रोनस क्यू आदि।

तो आप इनमें से कोई भी वर्ग बना सकते हैं और इसे कतार संदर्भ के रूप में पकड़ सकते हैं। उदाहरण के लिए

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

आप अपने स्वयं के कस्टम क्यू को लागू करने के लिए कतार इंटरफ़ेस भी लागू कर सकते हैं।


4

Queueजावा में एक इंटरफ़ेस है, आप ऐसा नहीं कर सकते। प्रयत्न:

Queue<Integer> Q = new LinkedList<Integer>();
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.