2012-02-21 11 views
6

मान लें कि मेरे पास List<SomeObject> a है।
अब यह भी मान लें कि मेरे पास List<SomeProcessor> b है।
प्रत्येक SomeProcessor इसकी प्रसंस्करण के लिए a का उपयोग करता है।जावा: 2 सूचियों को फिर से भरने के लिए सबसे अच्छा/सुरुचिपूर्ण तरीका

इसके अलावा:

int idx = 0; 
for(SomeProcessor o:b){ 
    o2 = a.get(idx); 
    o.doSomething(o2); 
    idx++; 
} 

इस संभाल करने के लिए एक और अधिक सुरुचिपूर्ण रास्ता नहीं है?

+0

एक समर्थन Iterable इंटरफ़ेस करता है? – Wint

+0

नहीं। यह सिर्फ एक कस्टम वस्तु है। यह कैसे मदद करेगा? मेरा मतलब है कि एक होना चाहिए? – Jim

+1

इस उत्तर को देखें: http://stackoverflow.com/a/8104205/1029272 लागू करने में आसान है, और एक इलाज करता है। मैं इसे पाने के लिए पिछले 5 मिनट के भीतर इसे चला गया और चल रहा था। – Deco

उत्तर

7
public interface Processor<T> { 
    public void process(T object); 
} 

और फिर एक सहायक विधि:

public static <T> void processAll(Collection<T> items, Collection<? extends Processor<T>> processors) { 
    Iterator<T> i = items.iterator(); 
    Iterator<? extends Processor<T>> p = processors.iterator(); 
    while(i.hasNext() && p.hasNext()) 
     p.next().process(i.next()); 
} 

आप वर्ग करता है, तो वहाँ केवल एक ही है जो इसे इस्तेमाल करता है, पर है कि सहायक विधि डाल सकता है (और यह private बनाने), या यह एक उपयोगिता डाल कक्षा जो पूरे कार्यक्रम द्वारा साझा की जाती है।

बेशक processAll कोड करने के अन्य तरीके हैं; उदाहरण के लिए, आप संग्रह में से किसी एक पर for पाश का उपयोग कर सकते हैं। लेकिन किसी भी मामले में, इस निम्न-स्तरीय कोड को एक सहायक विधि में तोड़ने से आपका उच्च-स्तरीय कोड क्लीनर और कम "शोर" बन जाएगा। और यदि आप प्रोग्राम के कई हिस्सों में कुछ ऐसा कर रहे हैं, तो वे सहायक विधि साझा कर सकते हैं।

+0

मैं नहीं चाहता इसे इस तरह संसाधित करने के लिए। मुझे प्रत्येक ऑब्जेक्ट को एक बार प्रोसेसर – Jim

+0

b.size() == a.size() द्वारा संसाधित करने की आवश्यकता है ??? –

+0

@ narek.gevorgyan: हाँ वे हमेशा एक ही आकार – Jim

1

यदि आप दो सूचियों के बजाय Map<SomeObject, SomeProcessor> उत्पन्न कर सकते हैं, तो यह सुरुचिपूर्ण होगा। यह लागू नहीं हो सकता है, लेकिन मैं इसे सिर्फ एक शॉट दे दूंगा।

1

हो सकता है कि आप इस सरल तरीके से कोशिश कर सकते हैं:

int idx = 0; 
while(idx<a.size() && idx<b.size()){ 
    b.get(idx).doSomething(a.get(idx++)); 
}