[java] अमरूद: कोई सूची नहीं है। फ़िल्टर () फ़ंक्शन?



Answers

आप Iterables.filter उपयोग कर सकते हैं, जो निश्चित रूप से ऑर्डरिंग बनाए रखेगा।

ध्यान दें कि एक नई सूची बनाकर , आप तत्वों की प्रतिलिपि बनायेंगे (केवल संदर्भ, संदर्भ) - इसलिए यह मूल सूची पर लाइव दृश्य नहीं होगा। एक दृश्य बनाना बहुत मुश्किल होगा - इस स्थिति पर विचार करें:

Predicate<StringBuilder> predicate = 
    /* predicate returning whether the builder is empty */
List<StringBuilder> builders = Lists.newArrayList();
List<StringBuilder> view = Lists.filter(builders, predicate);

for (int i = 0; i < 10000; i++) {
    builders.add(new StringBuilder());
}
builders.get(8000).append("bar");

StringBuilder firstNonEmpty = view.get(0);

उसे पूरी मूल सूची में फिर से भरना होगा, फ़िल्टर को सबकुछ लागू करना होगा। मुझे लगता है कि यह आवश्यक हो सकता है कि अनुमानित मिलान दृश्य के जीवनकाल में परिवर्तित न हो, लेकिन यह पूरी तरह से संतोषजनक नहीं होगा।

(यह सिर्फ अनुमान लगा रहा है, आपको याद है। शायद अमरूद रखरखाव में से एक असली कारण के साथ चिपक जाएगा :)

Question

क्या कोई कारण है

Lists.transform()

लेकिन नहीं

Lists.filter()

?

मैं एक सूची को सही ढंग से कैसे फ़िल्टर करूं? मैं इस्तेमाल कर सकता हूँ

new ArrayList(Collection2.filter())

बेशक, लेकिन इस तरह यह गारंटी नहीं है कि अगर मैं सही ढंग से समझता हूं तो मेरा ऑर्डरिंग वही रहता है।




जैसा कि जॉन ने उल्लेख किया है, आप Iterables.filter(..) या Collections2.filter(..) उपयोग कर सकते हैं और यदि आपको लाइव व्यू की आवश्यकता नहीं है तो आप ImmutableList.copyOf(Iterables.filter(..)) या Lists.newArrayList( Iterables.filter(..)) उपयोग कर सकते हैं Lists.newArrayList( Iterables.filter(..)) और हाँ ऑर्डरिंग बनाए रखा जाएगा।

यदि आप वास्तव में भाग में रुचि रखते हैं, तो आप अधिक जानकारी के लिए http://code.google.com/p/guava-libraries/issues/detail?id=505 जा सकते हैं।




Related