2011-06-05 14 views
8

में चर के आधार पर ऑब्जेक्ट्स की सूची से ऑब्जेक्ट प्राप्त करें मेरे पास उपयोगकर्ता ऑब्जेक्ट की सूची है, मैं केवल उपयोगकर्ता ऑब्जेक्ट में चर के आधार पर उपयोगकर्ता ऑब्जेक्ट्स को सूची से प्राप्त करना चाहता हूं।ऑब्जेक्ट

public class User { 

    private int id; 

    private String sex; 

    private int age; 

    private String country; 

    /** 
    * Getter and setter for all variables 
    */ 
} 

मेरे पास इस तरह का मॉडल क्लास है। अब मेरे पास उपयोगकर्ता ऑब्जेक्ट्स की सूची है।

List<User> users = new ArrayList<User>(); 

यदि उपयोगकर्ता पुरुष है तो मैं उपयोगकर्ताओं की सूची से वस्तुओं को प्राप्त करना चाहता हूं।

List<User> ageList = new ArrayList<User>(); 
for(User object : users) { 
    if(object.getSex().equals("Male")){ 
     ageList.add(object); 
    } 
} 

मुझे उपरोक्त दृष्टिकोण पसंद नहीं है। ऑब्जेक्ट में परिवर्तनीय के आधार पर ऑब्जेक्ट्स की सूची से वस्तुएं प्राप्त करने का कोई बेहतर तरीका है ..?

क्या कोई संग्रह जावा संग्रह .. है? क्या हम Java Comparator का उपयोग कर इसे हल कर सकते हैं ..?

उत्तर

7

आप Guava का उपयोग कर रहे हैं, तो आप उपयोग कर सकते हैं Collections2.filter

Collection<User> males = Collections2.filter(users, user -> user.getSex().equals("Male")); 
+1

मुझे इस नोटेशन को पसंद नहीं करने का कारण यह है कि यह लंबे समय तक और पुस्तकालयों/विधियों को जोड़ता है जो बाद में इसे पढ़ने वाले किसी व्यक्ति से परिचित नहीं हो सकते हैं। यह एक शर्म की बात है जावा इस उपयोग के मामले के लिए बेहतर समर्थन नहीं है (बस लगभग हर दूसरी लोकप्रिय भाषा की तरह: पी) –

+1

@ पीटर: मैं सहमत हूं, रूबी एक अरब बार बेहतर है: 'पुरुष = उपयोगकर्ता। चयन {| उपयोगकर्ता | user.sex == 'Male'} ' –

+1

यहां तक ​​कि उबाऊ और बहुत पुराना एसक्यूएल 'उन उपयोगकर्ताओं से चुनें * जहां लिंग =" पुरुष "मुझे अभिव्यक्ति पसंद है जो दोनों छोटे हैं और कम प्रतीकों की आवश्यकता है। अधिकांश प्रोग्रामर सरल एसक्यूएल को समझ और लिख सकते हैं। –

3

आप इसे लैम्ब्डा कार्यों और प्रतिबिंबों के साथ कर सकते हैं। हालांकि चूंकि जावा बंद करने का समर्थन नहीं करता है, इसलिए आप पाएंगे कि यह दृष्टिकोण अधिक त्रुटि प्रवण है, अधिक कोड की आवश्यकता है और धीमी है।

यदि आप ऐसा करने का एक तेज़ तरीका चाहते हैं तो आप मुख्य रूप से एक मानचित्र < सेक, सूची < उपयोगकर्ता >> या मल्टीमैप कर सकते हैं।

बीटीडब्लू: मैं व्यक्ति के लिंग के लिए एक एनम का उपयोग करूंगा। आप खुद को कुछ संभावनाओं तक सीमित करने में सक्षम होना चाहिए;) आप देश के साथ समान रूप से ऐसा कर सकते हैं।

Collection<User> males = Collections2.filter(users, new Predicate<User>() { 
    @Override 
    public boolean apply(User user) { 
     return user.getSex().equals("Male"); 
    } 
}); 

और जावा 8 के साथ, आप और भी बेहतर कर सकते हैं::

+0

@Arul BTW धाराओं फिल्टर के साथ java8 में एक रास्ता मिल गया है, अगर सभी आप चाहते हैं, उन्हें सेक्स विशेषता के आधार पर पुन: प्राप्त करने के लिए उपयोगकर्ता है और आप इसे एक स्ट्रिंग की बदल सकता हूँ बजाय एक Enum प्रकार होना , तो आप एक EnumMap का उपयोग कर सकते हैं जो काफी तेज़ है, क्योंकि यह एक सरणी – Yaneeve

+0

पर आधारित है कुछ संभावनाएं? चलो देखते हैं ... मादा, पुरुष, intersex, अज्ञात, और अन्य (और जो भी अन्य विकल्प मैं भूल गया)? :-) –

+0

@ क्रिस, हालांकि आप इसे करते हैं, यह संख्या छोटी होगी। –

1

सरल फ़िल्टर के लिए मुझे पसंद है lambdaj वाक्य रचना onliners: http://code.google.com/p/lambdaj/wiki/LambdajFeatures

List<User> ageList = filter(having(on(User.class).getSex(), equalTo("Male")), users); 

जटिल परिस्थितियों के लिए अलग फ़िल्टर समापन बनाना बेहतर है।

0

से MultiValueMap या Map<String List<User>> से शुरुआत में उपयोगकर्ताओं को विभाजित करने के लिए उपयोग करें, अगर उपयोगकर्ता सेक्स के अनुसार आपको जो कुछ चाहिए, वह सब कुछ है।

जब तक आप एक अनारक्षित संग्रह से विशेष उपयोगकर्ताओं को प्राप्त करना चाहते हैं, तो पूरे संग्रह के माध्यम से खोजें एक जरूरी है। तो इसे पुनर्प्राप्त करने का कोई बेहतर तरीका नहीं है। हालांकि, आप सतह के नीचे इस तर्क को छुपा सकते हैं।

अपाचे सामान्य संग्रह (और क्रिस जेस्टर-यंग के रूप में अमरूद) CollectionUtils.select() प्रदान करते हैं, आपको केवल Predicate लागू करने की आवश्यकता है। (बेहतर स्पष्टीकरण के लिए क्रिस जेस्टर-यंग से जवाब देखें)

या, उपयोगकर्ताओं को पास करने के लिए संग्रह का उपयोग करने के बजाय, इसे Users या UserPack जैसी वस्तु में बनाएं। फिर आप ऑब्जेक्ट के अंदर सभी पुरुष उपयोगकर्ताओं को वापस करने के लिए एक विधि कॉल getMaleUsers() लागू कर सकते हैं। यह चाल काफी उपयोगी है यदि आपको विशेष वस्तुओं को बहुत अधिक कुशलतापूर्वक उपयोग करने की आवश्यकता है।

2

मैं

List<User> males = users.stream().filter(u -> u.getSex().equals("Male")).collect(Collectors.toList()); 
संबंधित मुद्दे