2011-12-08 11 views
5

मैं जावा में एक फ़ंक्शन के बारे में सोच रहा हूं, जिसे मैं आशा करता हूं। मैं एक एरेलिस्ट (कक्षा ए के बारे में कहता हूं) के माध्यम से पुन: प्रयास करना चाहता हूं, जिसमें कक्षा बी और सी की वस्तुएं शामिल हैं जो दोनों ए को बढ़ाती हैं। विचार, मैं केवल ऐरेलिस्ट में बी वर्ग की वस्तुओं (उदाहरण के लिए) के माध्यम से पुनरावृत्ति करना चाहता हूं।विस्तारित कक्षाओं के साथ Arraylist के माध्यम से इटरेटिंग

यह कैसे संभव है, नीचे दिए गए कोड में संक्षिप्त उदाहरण की तरह, और लंबे समय तक?

मुख्य वर्ग:

 import java.util.*; 

public class Test { 

    public static void main(String[] args) { 
     new Test(); 
    } 

    Test() { 
     ArrayList<A> a = new ArrayList<A>(); 
     a.add (new B()); 
     a.add (new C()); 
     a.add (new C()); 
     a.add (new B()); 
     a.add (new C()); 
     for (A aObject : a) { // this works, I want it shorter 
      if (aObject instanceof B) { 
       B b = (B) aObject; 
       System.out.println (b.hi); 
      } 
     } 
     for (B b : a) // like this? 
      System.out.println (b.hi); 
    } 
} 

एक:

public class A { 

} 

बी:

public class B extends A { 
    String hi = "hi"; 
} 

सी:

public class C extends A { 

} 

संपादित करें: क्योंकि बहुत से लोग इसका उत्तर देते हैं: मुझे उदाहरण के उपयोग के बारे में पता है। मैं सरणी, जिनमें से वर्ग बी

है में सभी वस्तुओं को लूप करने के लिए एक तेज़ तरीका चाहते
+0

आपको सभी सूची के माध्यम से और सूची के प्रत्येक ऑब्जेक्ट के लिए यह जांचने के लिए है कि यह आपके इच्छित वर्ग का है या नहीं। आप नीचे दिए गए उत्तर में पहले से बताए गए कुंजीपटल "उदाहरण" में देखना चाहते हैं ... लेकिन मुझे डर है कि कोड आपके जैसा ही होगा (लेकिन दृष्टिकोण का उदाहरण बेहतर/क्लीनर है) – Pitelk

+0

आपके द्वारा संपादित किए जाने से पहले प्रश्न यह स्पष्ट नहीं था कि आप क्या पूछ रहे थे। – JRSofty

उत्तर

2

आप बना सकते हैं एक पुन: प्रयोज्य फ़िल्टर इसके लिए वर्ग, FileFilter के समान। (Guava के उपयोग के लिए korifey का जवाब देखें।) इसके अलावा, नहीं, ऐसा करने के लिए कोई मौजूदा कार्यक्षमता नहीं है। इसके अतिरिक्त, किसी मौजूदा कार्यक्षमता को वही करना होगा जो आप वैसे भी कर रहे हैं, क्योंकि List प्रकारों में यह जानने का कोई तरीका नहीं है कि ऑब्जेक्ट्स के विभिन्न वर्ग सूची में कहां हैं। (इसे उन पर फिर से ढूंढना होगा।)

यदि आपको इसके आसपास एक उच्च-प्रदर्शन समाधान की आवश्यकता है, तो आप अपने अलग-अलग उदाहरणों के लिए अलग-अलग सूचियों को संग्रहीत करने पर विचार कर सकते हैं - या तो आपके प्रतिस्थापन में या इसके अतिरिक्त वर्तमान सूची आप इसे एक समग्र कक्षा में भी लपेट सकते हैं जो एक सामान्य एपीआई के माध्यम से दोनों कार्यक्षमताओं (वर्ग द्वारा सभी उदाहरण और उदाहरण) प्रदान करेगा।

+0

उत्तर के लिए धन्यवाद, मैं सिर्फ उत्सुक था, उच्च प्रदर्शन की कोई ज़रूरत नहीं थी, लेकिन शायद मुझे इसकी आवश्यकता होगी। बहुत बढ़िया जवाब! – Hidde

2

आप guava

इस तरह उपयोग कर सकते हैं:

for (B b: Iterables.filter(a, B.class)) { 
System.out.println (b.hi); 
} 
+0

यह ओपी के समान काम नहीं करता है: फ़िल्टर सी उदाहरणों को स्वीकार करता है, जबकि ओपी केवल बी उदाहरणों को स्वीकार करता है जो सी नहीं हैं। ओपी एक पुन: प्रयोज्य भविष्यवाणी का उपयोग कर सकता है। –

+0

सी ए बढ़ाता है, बी नहीं फ़िल्टर क्यों सी स्वीकार करता है? – korifey

+0

क्षमा करें, मेरी गलती। यदि सी विस्तारित बी है, और यदि ओपी ने अपना मूल कोड रखा था जहां उसने उदाहरण का उपयोग करने के बजाय कक्षाओं की तुलना की थी, तो एक अंतर होगा। –

0

मैं जेआरएसॉफ्टी के साथ सहमत हूं।

for (A aObject : a) 
    if (aObject instanceof B) 
     System.out.println(((B) aObject).hi); 

यह instanceof ऑपरेटर का उपयोग एक बेहतर विचार है:

for (A aObject : a) { 
    if (aObject instanceof B) { // <-- This is as short I can make it 
     B b = (B) aObject; 
     System.out.println (b.hi); 
    } 
} 
+0

मैंने उदाहरण के बिना पहले से ही उदाहरण दिखाया है, लेकिन एक ही बात है। – Hidde

0

आप इस प्रकार का सरल पाश लिख सकते हैं। लेकिन सूची के उदाहरणों को फ़िल्टर करने के लिए जो B प्रकार नहीं हैं, आपको अतिरिक्त संग्रह लाइब्रेरी को एकीकृत करने की आवश्यकता होगी, क्योंकि वह ऑपरेशन मानक संग्रह API द्वारा सीधे समर्थित नहीं है। हो सकता है कि Guava या LambdaJ आपके द्वारा फ़िल्टर किए जाने वाले फ़िल्टरिंग ऑपरेशन के लिए समर्थन है, मैंने अभी तक जांच नहीं की है।

संबंधित मुद्दे