जावा में संग्रहों के संग्रह के लिए एक पुनरावर्तक डिज़ाइन करें। इटरेटर को घोंसले को छिपाना चाहिए, जिससे आप सभी संग्रहों से जुड़े सभी तत्वों को फिर से सक्रिय कर सकते हैं जैसे कि आप एक संग्रह के साथ काम कर रहे थेसाक्षात्कार: संग्रहों के संग्रह के लिए एक पुनरावर्तक डिजाइन करें
उत्तर
यहां एक संभावित कार्यान्वयन है। ध्यान दें कि मैं निकालें() लागू नहीं किया गया छोड़ दिया:
public class MultiIterator <T> implements Iterator<T>{
private Iterator<? extends Collection<T>> it;
private Iterator<T> innerIt;
private T next;
private boolean hasNext = true;
public MultiIterator(Collection<? extends Collection<T>> collections) {
it = collections.iterator();
prepareNext();
}
private void prepareNext() {
do {
if (innerIt == null || !innerIt.hasNext()) {
if (!it.hasNext()) {
hasNext = false;
return;
} else
innerIt = it.next().iterator();
}
} while (!innerIt.hasNext());
next = innerIt.next();
}
@Override
public boolean hasNext() {
return hasNext;
}
@Override
public T next() {
if (!hasNext)
throw new NoSuchElementException();
T res = next;
prepareNext();
return res;
}
@Override
public void remove() {
//TODO
}
}
आपका समाधान संग्रह के दिए गए संग्रह में नल के लिए खाता नहीं है। ठीक करें: readyNext() में, आंतरिक लूप को तब तक जारी रखना चाहिए जब तक it.next() इसे करने से पहले गैर-शून्य है। Anxt()। Iterator(), और अगर कोई गैर-शून्य संग्रह ऑब्जेक्ट नहीं है तो उसे जमानत करनी चाहिए हमें उपयोग करने के लिए। – Kowshik
सबसे पहले, java.util में इटरेटर के कार्यान्वयन पर नज़र डालें। LinkedList
http://www.docjar.com/html/api/java/util/LinkedList.java.html
वहां से अपने काम है सिर्फ एक इटरेटर कि खाते में तथ्य यह है कि यह संग्रह से अधिक पुनरावृत्ति है लेता लागू आसान।
सम्मान।
यह क्यों कम किया गया था? –
अगर सभी आप के साथ काम करना है जावा इटरेटर है: जो सिर्फ hasNext(), अगले() और (निकालने के लिए), मैं समझ तुम चारों ओर जाना है यह।
इसे संसाधित करें क्योंकि आप 2 डी सरणी को संसाधित करेंगे, यानी बाहरी और आंतरिक पाश के साथ, क्योंकि उनके पास "व्यवस्था" है लेकिन अलग-अलग डेटाटाइप है। जैसे ही आप प्रक्रिया करते हैं, आप उन्हें एक नए संग्रह में स्थानांतरित करते हैं।
तो शायद एक निजी विधि:
private void convertToSingleCollection()
{
while("column")
{
//convert the "column" to an arra
for("Row")
{
//add to newCollection here
}
//remove the processed column from CollectionOFcollection
}
}
//call the above method in your constructor
public iterator<T> Iterator()
{
newCollection.iterator();
}
public boolean hasNext()
{
return Iterator().hasNext()
}
public T next()
{
if(!hasNext())
{
//exception message or message
}
else
//return "next"
}
अंत
मुझे आशा है कि इस मदद करता है। मुझे लगता है कि इसे हल करने के अन्य तरीके होना चाहिए।
this post में आप दो कार्यान्वयन देख सकते हैं, केवल (मामूली) अंतर यह है कि यह संग्रहों के संग्रह के बजाय इटेटरेटर का पुनरावर्तक लेता है।
यह अंतर आवश्यकता राउंड रोबिन फैशन में तत्वों (एक आवश्यकता है कि इस प्रश्न में ओपी द्वारा अनुरोध नहीं किया गया था) पुनरावृत्ति करने के साथ संयुक्त एक सूची में iterators को कॉपी करने की भूमि के ऊपर कहते हैं।
पहले दृष्टिकोण आलसी है: यह एक तत्व केवल जब इस तत्व का अनुरोध किया जाता पुनरावृति जाएगा, 'मूल्य' हम भुगतान किया है कि कोड अधिक जटिल है, क्योंकि यह अधिक किनारे मामलों को संभालने के लिए की जरूरत है:
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
import java.util.NoSuchElementException;
public class MultiIterator<E> implements Iterator {
List<Iterator<E>> iterators = new LinkedList<>();
Iterator<E> current = null;
public MultiIterator(Iterator<Iterator<E>> iterator) {
// copy the iterators into a list
while (iterator.hasNext()) {
iterators.add(iterator.next());
}
}
@Override
public boolean hasNext() {
boolean result = false;
if (iterators.isEmpty() && (current == null || !current.hasNext())) {
return false;
}
if (current == null) {
current = iterators.remove(0);
}
while (!current.hasNext() && !iterators.isEmpty()) {
current = iterators.remove(0);
}
if (current.hasNext()) {
result = true;
}
return result;
}
@Override
public E next() {
if (current == null) {
try {
current = iterators.remove(0);
} catch (IndexOutOfBoundsException e) {
throw new NoSuchElementException();
}
}
E result = current.next(); // if this method was called without checking 'hasNext' this line might raise NoSuchElementException which is fine
iterators.add(current);
current = iterators.remove(0);
return result;
}
// test
public static void main(String[] args) {
List<Integer> a = new LinkedList<>();
a.add(1);
a.add(7);
a.add(13);
a.add(17);
List<Integer> b = new LinkedList<>();
b.add(2);
b.add(8);
b.add(14);
b.add(18);
List<Integer> c = new LinkedList<>();
c.add(3);
c.add(9);
List<Integer> d = new LinkedList<>();
d.add(4);
d.add(10);
d.add(15);
List<Integer> e = new LinkedList<>();
e.add(5);
e.add(11);
List<Integer> f = new LinkedList<>();
f.add(6);
f.add(12);
f.add(16);
f.add(19);
List<Iterator<Integer>> iterators = new LinkedList<>();
iterators.add(a.iterator());
iterators.add(b.iterator());
iterators.add(c.iterator());
iterators.add(d.iterator());
iterators.add(e.iterator());
iterators.add(f.iterator());
MultiIterator<Integer> it = new MultiIterator<>(iterators.iterator());
while (it.hasNext()) {
System.out.print(it.next() + ","); // prints: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
}
}
}
और दूसरा ('लालची' का अनुरोध किया आदेश में सभी iterators से सभी तत्वों की सूची में कॉपी करने और उस सूची को पुनरावर्तक लौटने):
import java.util.Iterator;
import java.util.LinkedList;
import java.util.List;
public class MultiIterator<E> {
Iterator<Iterator<E>> iterator = null;
List<E> elements = new LinkedList<>();
private MultiIterator(Iterator<Iterator<E>> iterator) {
this.iterator = iterator;
}
private void copyElementsInOrder() {
List<Iterator<E>> iterators = new LinkedList<>();
// copy the iterators into a list
while (iterator.hasNext()) {
iterators.add(iterator.next());
}
// go over the list, round-robin, and grab one
// element from each sub-iterator and add it to *elements*
// empty sub-iterators will get dropped off the list
while (!iterators.isEmpty()) {
Iterator<E> subIterator = iterators.remove(0);
if (subIterator.hasNext()) {
elements.add(subIterator.next());
iterators.add(subIterator);
}
}
}
public static <E> Iterator<E> iterator(Iterator<Iterator<E>> iterator) {
MultiIterator<E> instance = new MultiIterator<>(iterator);
instance.copyElementsInOrder();
return instance.elements.iterator();
}
// test
public static void main(String[] args) {
List<Integer> a = new LinkedList<>();
a.add(1);
a.add(7);
a.add(13);
a.add(17);
List<Integer> b = new LinkedList<>();
b.add(2);
b.add(8);
b.add(14);
b.add(18);
List<Integer> c = new LinkedList<>();
c.add(3);
c.add(9);
List<Integer> d = new LinkedList<>();
d.add(4);
d.add(10);
d.add(15);
List<Integer> e = new LinkedList<>();
e.add(5);
e.add(11);
List<Integer> f = new LinkedList<>();
f.add(6);
f.add(12);
f.add(16);
f.add(19);
List<Iterator<Integer>> iterators = new LinkedList<>();
iterators.add(a.iterator());
iterators.add(b.iterator());
iterators.add(c.iterator());
iterators.add(d.iterator());
iterators.add(e.iterator());
iterators.add(f.iterator());
Iterator<Integer> it = MultiIterator.<Integer>iterator(iterators.iterator());
while (it.hasNext()) {
System.out.print(it.next() + ","); // prints: 1,2,3,4,5,6,7,8,9,10,11,12,13,14,15,16,17,18,19,
}
}
}
मैं एक साधारण 'परीक्षण' शामिल मल्टीइटरेटर का उपयोग करने के तरीके को दिखाने के लिए कोड, यह हमेशा नहीं होता है तुच्छ (जेनेरिक के उपयोग की वजह से) जैसा कि आप लाइन पर देख सकते हैं:
Iterator<Integer> it = MultiIterator.<Integer>iterator(iterators.iterator());
- 1. वीबीए - संग्रहों के संग्रह में संग्रह कैसे जोड़ें
- 2. डिजाइन साक्षात्कार - कार आरक्षण प्रणाली
- 3. अमेज़ॅन साक्षात्कार प्रश्न: एक ओओ पार्किंग स्थल डिजाइन करें
- 4. डब्ल्यूपीएफ पुनरावर्तक (जैसे) संग्रह स्रोत के लिए नियंत्रण?
- 5. क्या NHibernate एक पुनरावर्तक के बिना संग्रह सहेज सकता है?
- 6. एक पुनरावर्तक को अग्रेषित करने के लिए एक पुनरावर्तक को कैसे प्रतिबंधित करें?
- 7. साक्षात्कार क्यू - डिजाइन फाइल सिस्टम - समीक्षा
- 8. लिंक्डलिस्ट एक साक्षात्कार के परीक्षण
- 9. .NET साक्षात्कार, कोड संरचना और डिजाइन
- 10. पुनरावर्तक नियंत्रण - विशिष्ट आइटम के लिए बाध्य रद्द करें
- 11. बड़े बैकबोन संग्रहों के साथ काम करना
- 12. एक पुनरावर्तक कैसे क्लोन करें?
- 13. संग्रहों के संग्रह ब्राउज़ करने के लिए SPARQL में रिकर्सिव प्रश्न
- 14. एक पुनरावर्तक
- 15. नेवला - कई उदाहरण के लिए एक संग्रह
- 16. मैं एक पुनरावर्तक
- 17. संग्रहों के लिए बाध्यकारी वास्तव में कैसे काम करता है?
- 18. एक पुनरावर्तक के लिए एक क्रियाशील सूची बाइंडिंग - ASP.NET
- 19. संसाधनों के संग्रह के बीच आरईएसटी एपीआई डिजाइन लिंक
- 20. इंटरफेस और सिंक्रनाइज़ किए गए संग्रहों के लिए प्रोग्रामिंग
- 21. कमान MongoDB संग्रह reindexing करने के लिए सभी MongoDB संग्रह
- 22. मोंगोस - विभिन्न संग्रहों के लिए समान स्कीमा (मोंगोडीबी)
- 23. एक असेंबलर बनाने के लिए डिजाइन पैटर्न
- 24. एक शॉपिंग कार्ट आवेदन के लिए एक डेटाबेस डिजाइन?
- 25. जावा: सॉफ़्टवेयर परीक्षक के लिए साक्षात्कार प्रश्न?
- 26. एक अभ्यास साक्षात्कार के प्रश्न का उत्तर
- 27. साक्षात्कार प्रश्न में ज्ञान के लिए एसक्यूएल
- 28. सी # अनमोडिफायबल संग्रहों के बहु-थ्रेडेड रीडिंग
- 29. स्कैला 2.10 में सभी संग्रहों के लिए समांतरता स्तर सेट करें?
- 30. पायथन - एक पुनरावर्तक वर्ग
* डिज़ाइन * के लिए क्या है? नमूना? कार्यान्वयन? –
दोनों, इंटरफ़ेस क्या है, और आप इसे कैसे कार्यान्वित करेंगे? –
यदि यह आपका नौकरी साक्षात्कार है, तो आप इसे सिर्फ _doing_ के बजाय यहां क्यों पोस्ट कर रहे हैं? – Jasper