2016-03-27 13 views
12

मैं इस मंच में & google पर खोज करने के बाद अपनी क्वेरी पोस्ट कर रहा हूं, लेकिन इसे हल करने में असमर्थ था। जैसे: Link1Link2Link3स्ट्रीम सूची 1 सूची के आधार पर 1 सूची

मैं फिल्टर करने के लिए सूची 2 (बहु स्तंभ) सूची 1.

List1: 
- [Datsun] 
- [Volvo] 
- [BMW] 
- [Mercedes] 

List2: 
- [1-Jun-1995, Audi, 25.3, 500.4, 300] 
- [7-Apr-1996, BMW, 35.3, 250.2, 500] 
- [3-May-1996, Porsche, 45.3, 750.8, 200] 
- [2-Nov-1998, Volvo, 75.3, 150.2, 100] 
- [7-Dec-1999, BMW, 95.3, 850.2, 900] 

expected o/p: 
- [7-Apr-1996, BMW, 35.3, 250.2, 500] 
- [2-Nov-1998, Volvo, 75.3, 150.2, 100] 
- [7-Dec-1999, BMW, 95.3, 850.2, 900] 

कोड

// List 1 in above eg 
List<dataCarName> listCarName = new ArrayList<>(); 
// List 2 in above eg 
List<dataCar> listCar = new ArrayList<>(); 

// Values to the 2 lists are populated from excel 

List<dataCar> listOutput = listCar.stream().filter(e -> e.getName().contains("BMW")).collect(Collectors.toList()); 

में मूल्यों में के आधार पर कोशिश कर रहा हूँ कोड के ऊपर यदि मैं एक विशिष्ट मान प्रदान करता हूं तो मैं फ़िल्टर कर सकता हूं, लेकिन यह सुनिश्चित नहीं करता कि सूची 2 में कार का नाम सूची में मौजूद है या नहीं।

आशा है कि मेरे सामने जिस मुद्दे का सामना करना है, वह स्पष्ट है, मैं अभी भी जावा के लिए अपेक्षाकृत नया हूं, इसलिए उपर्युक्त क्वेरी बहुत बुनियादी है, इसलिए क्षमा करें)।

संपादित मेरा मानना ​​है कि लिंक -3 ऊपर प्रदान हल करना चाहिए, लेकिन मेरे मामले में यह काम नहीं कर रहा। हो सकता है कि क्योंकि सूची -1 में मूल्यों के रूप में [email protected] .. आदि भर जाती है मैं फोन करके मानव पठनीय प्रारूप में मूल्य प्राप्त करने के केवल जब मैं सूची 1 पर एक foreach कर सकता हूँ getName विधि।

+1

आप एक सटीक मिलान के लिए देख रहे हैं, या यह पर्याप्त है कि कार का नाम दूसरी सूची में कारों में से एक के प्रकार के होते हैं: एलेक्सिस 'सुझाव संशोधन करना, परिणाम की तरह लग रहे हैं?(जैसा कि 'बराबर' के बजाय 'शामिल' के आपके उपयोग द्वारा सुझाया गया है) – Eran

+2

' .filter (e -> listCarName.contains (e.getName())) '? – Tunaki

+2

आपके द्वारा लिंक किए गए तीसरे प्रश्न से पता चलता है कि आप जो चाहते हैं उसे प्राप्त करने के लिए: http://stackoverflow.com/questions/26170264/java-8-lambda-filter-collection-by-another-collection –

उत्तर

25

यह स्पष्ट नहीं है कि 10 की बजाय List<DataCarName> आपके स्थान पर क्यों है।

विधेय प्रदान करने के लिए करता है, तो संबंधित डेटा कार उदाहरण के लिए, वहाँ सूची में उसका नाम है की जाँच करना चाहिए।

e -> e.getName().contains("BMW") केवल जांच करेगा कि डेटा कार के नाम पर जो है कि तुम क्या नहीं करना चाहता बीएमडब्ल्यू शामिल हैं। आपका पहला प्रयास तो

e -> listCarName.contains(e.getName()) 

हो सकता है लेकिन जब से listCarName एक List<DataCarName> और e.getName() एक स्ट्रिंग (मुझे लगता है) है, तो आप एक परिणाम के रूप में एक खाली सूची मिल जाएगा।

आपके पास पहला विकल्प है कि आप भविष्य में परिवर्तन करना चाहते हैं ताकि आपको डेटा कार नामों की सूची से स्ट्रीम मिल सके, उन्हें अपने स्ट्रिंग प्रस्तुति पर मानचित्रित करें और जांचें कि इनमें से कोई भी नाम वर्तमान डेटा कार इंस्टेंस के नाम से मेल खाता है वर्तमान में फ़िल्टर कर रहे हैं:

List<DataCar> listOutput = 
    listCar.stream() 
      .filter(e -> listCarName.stream().map(DataCarName::getName).anyMatch(name -> name.equals(e.getName()))) 
      .collect(Collectors.toList()); 

अब यह बहुत महंगा है क्योंकि आप डेटा कार स्ट्रीम पाइपलाइन में प्रत्येक उदाहरण के लिए एक स्ट्रीम बनाते हैं। एक बेहतर तरीका एक Set<String> कार 'नाम के साथ अग्रिम के निर्माण के लिए किया जाएगा और उसके बाद बस इस सेट पर एक विधेय के रूप में contains का उपयोग करें:

Set<String> carNames = 
    listCarName.stream() 
       .map(DataCarName::getName) 
       .collect(Collectors.toSet()); 

List<DataCar> listOutput = 
    listCar.stream() 
      .filter(e -> carNames.contains(e.getName())) 
      .collect(Collectors.toList()); 
+0

आपके समय के लिए धन्यवाद और आपके मार्गदर्शन के लिए ईमानदारी से प्रशंसा। – iCoder

4
अपने DataCar प्रकार में

, getName() एक स्ट्रिंग या DataCarName enum प्रकार वापसी करता है? यदि यह enum है, तो आप एलेक्सिस सी के दृष्टिकोण का पालन सकता है, लेकिन() एक HashSet Collectors.toSet का उपयोग कर निर्माण करने के बजाय, एक EnumSet, जो हे (1) प्रदर्शन देता है निर्माण।

Set<DataCarName> carNames = 
    listCarName.stream() 
       .collect(Collectors.toCollection(
        ()-> EnumSet.noneOf(DataCarName.class))); 

List<DataCar> listOutput = 
    listCar.stream() 
       .filter(car -> carNames.contains(car.getName())) 
       .collect(Collectors.toList()); 
+0

आपके इनपुट के लिए धन्यवाद, यह देखने के लिए कि क्या आपका सुझाव मेरी विशिष्ट आवश्यकता के लिए एक अंतर बनाता है, मेरे अंत में जांच करेगा। – iCoder

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