मैं एक इटरेटर क्लास बनाना चाहता हूं जो मुझे जेनेरिक प्रकारों (जैसे lst1 पूर्णांक, lst2 स्ट्रिंग) के साथ एक आइटम के बाद सूचियों के माध्यम से पुन: सक्रिय करने की अनुमति देता है। इसके लिए मुझे निम्नलिखित दी गई स्थिति पर विचार करना होगा।जावा में किसी अन्य के बाद विभिन्न प्रकार के एक आइटम के साथ दो जेनेरिक सूचियों के माध्यम से कैसे पुनरावृत्ति करें?
इंटरफ़ेस एक सामान्य इटरेटर है। कोड का यह हिस्सा संशोधित नहीं किया जा सकता है।
interface Iterator<E> {
E next();
boolean hasNext();
}
सूची वर्ग को निम्नानुसार परिभाषित किया गया है। सबसे महत्वपूर्ण, एक सूची वस्तु विधि इटरेटर() के साथ एक इटेरेटर ऑब्जेक्ट वापस कर सकती है। कोड का यह हिस्सा संशोधित नहीं किया जा सकता है।
class List<T> {
class ListNode {
T val;
ListNode next;
ListNode (T v) {
val = v; next = null;
}
}
ListNode head;
List (ListNode hd) { head = hd; }
List() { this(null); }
void prepend (T val) {
ListNode p = new ListNode(val);
p.next = head;
head = p;
}
//some other methods
class ListIterator implements Iterator<T> {
ListNode pos;
ListIterator() {
pos = head;
}
public T next() {
T res = pos.val;
pos = pos.next;
return res;
}
public boolean hasNext() {
return pos != null;
}
}
Iterator<T> getIterator() {
return this.new ListIterator();
}
}
मान लें कि दोनों सूची में एक ही प्रकार है और अब उनके पास भी वही लंबाई है। मैंने दो इटरेटर ऑब्जेक्ट्स के साथ एक क्लास बनाने की कोशिश की और इंटरफ़ेस इटरेटर को लागू करने के लिए इटरेटर ऑब्जेक्ट्स के तरीकों का उपयोग किया। कोड का यह हिस्सा मेरे द्वारा बनाया गया है और संशोधित किया जा सकता है।
class ZipIterator<T> implements Iterator<T>
{
int counter;
Iterator<T> first;
Iterator<T> second;
ZipIterator (Iterator<T> f, Iterator<T> s)
{
first = f;
second = s;
counter = 0;
}
public T next()
{
if (counter % 2 == 0)
{
counter++;
return first.next();
}
else
{
counter++;
return second.next();
}
}
public boolean hasNext()
{
if (counter % 2 == 0)
return first.hasNext();
else
return second.hasNext();
}
}
यह एक ही प्रकार के साथ दो सूची के लिए ठीक काम करता है। यहाँ कोड और आउटपुट मैं परीक्षण के लिए इस्तेमाल किया है:
class IteratorUtils
{
public static void main (String[] args)
{
List<Integer> lst1 = new List<>();
List<Integer> lst2 = new List<>();
lst1.prepend(3);
lst1.prepend(2);
lst1.prepend(1);
lst2.prepend(8);
lst2.prepend(9);
lst2.prepend(10);
Iterator<Integer> it1 = lst1.getIterator();
Iterator<Integer> it2 = lst2.getIterator();
ZipIterator<Integer> zit = new ZipIterator<>(it1, it2);
while (zit.hasNext())
{
System.out.println(zit.next());
}
}
}
आउटपुट:
1
10
2
9
3
8
अब मैं एक सामान्य तरीके ZipIterator लागू करना चाहते हैं, तो मैं विभिन्न प्रकार के साथ दो सूचियों का उपयोग कर सकते हैं वस्तुओं (जैसे पूर्णांक और स्ट्रिंग)। मुझे पता है कि मुझे कक्षा ZipIterator को बदलना है, इसलिए अगला तरीका() एक सामान्य प्रकार देता है लेकिन मुझे नहीं पता कि कैसे। यह एक विश्वविद्यालय कार्य है जो मुझे करना है और प्रोफेसर ने संकेत दिया है "जंगली कार्ड्स का उपयोग करें जैसे: टी, सुपर टी, विस्तारित करता है" ऑब्जेक्ट बढ़ाता है। लेकिन जंगली कार्ड के साथ मैं केवल विरासत दिशा में या उसके खिलाफ प्रकार निर्दिष्ट कर सकता हूं, है ना? क्या ज़िप्टरेटर वर्ग को इस तरह से बदलना संभव है जिससे यह दो प्रकार के ऑब्जेक्टर्स को विभिन्न प्रकारों से स्वीकार कर सके?
वहाँ पर किसी भी बाधाओं हैं दो प्रकार? यदि नहीं, तो आप सबसे अच्छा कर सकते हैं 'ऑब्जेक्ट' वापस कर सकते हैं। –
आपके द्वारा पोस्ट किए गए कोड का कौन सा हिस्सा असाइनमेंट में दिया गया है और आप किस भाग को संशोधित कर सकते हैं? – user1803551
ठीक है, मैं जवाब दे सकता हूं, लेकिन यह असाइनमेंट की सभी कठिनाई को दूर करेगा। हालांकि मैं एक संकेत दे सकता हूं, [पीईसीएस] पर एक नज़र डालें (http://stackoverflow.com/questions/2723397/what-is-pecs-producer-extends-consumer-super)। –