2013-06-02 6 views
20

मैं दो फ़ाइलों में से पढ़ने और उन्हें दो अलग-अलग सरणी में स्टोर करने की कोशिश कर रहा हूं। फाइलों में ऐसे शब्द होते हैं जो या तो लाइन पर अकेले होते हैं या अल्पविराम से अलग कई शब्द होते हैं। मैं निम्नलिखित कोड के साथ एक फ़ाइल को पढ़ने (पूरा नहीं):किसी अन्य सरणीसूची में मौजूद किसी सरणी सूची में सभी ऑब्जेक्ट्स को हटाएं

ArrayList<String> temp = new ArrayList<>(); 

FileInputStream fis; 
fis = new FileInputStream(fileName); 

Scanner scan = new Scanner(fis); 

while (scan.hasNextLine()) { 
    Scanner input = new Scanner(scan.nextLine()); 
    input.useDelimiter(","); 
    while (scan.hasNext()) { 
     String md5 = scan.next(); 
     temp.add(md5); 
    } 
} 
scan.close();  

return temp; 

मैं अब पहले फ़ाइल से सभी शब्दों को जो भी दूसरी फ़ाइल में मौजूद में दो फ़ाइलों को पढ़ने और हटाने की जरूरत (वहाँ कुछ डुप्लिकेट शब्द हैं फाइलों में)। मैंने फॉर-लूप और अन्य ऐसी चीजों के साथ प्रयास किया है, लेकिन कुछ भी काम नहीं किया है इसलिए किसी भी मदद की सराहना की जाएगी!

बोनस प्रश्न: मुझे यह भी पता लगाना होगा कि दो फाइलों में कितने डुप्लिकेट हैं - मैंने दोनों सरलीस्ट को हैशसेट में जोड़कर और फिर सेट के आकार को दो के संयुक्त आकार से घटाकर किया है सरणीसूची - क्या यह एक अच्छा समाधान है, या यह बेहतर किया जा सकता है?

list1.removeAll(list2); 
+0

[एक और ArrayList से एक ArrayList घटाने] की संभावित डुप्लिकेट (http://stackoverflow.com/questions/9933403/subtracting-one-arraylist-from-another-arraylist) –

उत्तर

28

आप किसी अन्य सूची में से एक सूची के आइटम हटाने के लिए removeAll विधि का उपयोग कर सकते हैं:

+0

धन्यवाद! मैंने निकालने का प्रयास करने की कोशिश की: ऐरेलिस्ट file1 = readFile (fileName1); ऐरेलिस्ट file2 = readFile (fileName2); file1.removeAll (file2); वापसी फ़ाइल 1; कोई विचार क्यों यह काम नहीं कर रहा है? – GeorgeWChubby

+0

आपकी समस्या कहीं और होनी चाहिए। क्या हो रहा है यह देखने के लिए निकालने के ऑपरेशन के बाद फ़ाइल 1, फ़ाइल 2 और फ़ाइल 1 की सामग्री को प्रिंट करने का प्रयास करें। – Joni

+0

समस्या यह है कि निकालें सभी ऑपरेशन पूरी चीज को लटका देता है।मैंने इसे 50 मिनट तक चलाने दिया और कुछ भी नहीं हुआ - जब तक मैं विधि को कॉल नहीं करता तब तक मैं सब कुछ ठीक काम करता हूं (और अगर मैं हटा देता हूं सभी ऑपरेशन विधि ठीक काम करती है)। सचमुच काम करने वाला एकमात्र चीज निकालना है, जो मुझे भ्रमित करता है। – GeorgeWChubby

6

संग्रह सुविधा इस उद्देश्य के लिए एक सुविधाजनक तरीका है।

डुप्लिकेट आप retainAll विधि का उपयोग कर सकते हैं प्राप्त करने के लिए, हालांकि सेट के साथ अपने दृष्टिकोण को भी अच्छा (और शायद अधिक कुशल)

2

दूसरों के रूप में उल्लेख किया है, Collection.removeAll विधि का उपयोग करता है, तो आप सभी तत्वों को निकालना चाहते है जो कि संग्रह से एक संग्रह में मौजूद है, आप removeall पर आक्रमण कर रहे हैं।

आपके बोनस प्रश्न के लिए, मैं गुवा के Sets वर्ग का एक बड़ा प्रशंसक हूं।

Sets.intersection(wordSetFromFile1, wordSetFromFile2).size(); 

मान लिया जाये कि आप दोनों फ़ाइलों से शब्दों का एक सेट बनाया है, तो आप तय कर सकते हैं कि कितने अलग शब्द वे कहते हैं कि एक लाइनर के साथ आम में है: इस प्रकार मैं Sets.intersection के उपयोग का सुझाव देते हैं।

2

पहले अपने कस्टम वर्ग में समान विधि ओवरराइड और हटाने सूची

public class CustomClass{ 

@Override 
    public boolean equals(Object obj) { 

     try { 
      CustomClass licenceDetail = (CustomClass) obj; 
      return name.equals(licenceDetail.getName()); 
     } 
     catch (Exception e) 
     { 
      return false; 
     } 

    } 
} 

दूसरा का मिलान मापदंड आप removeAll() विधि फोन परिभाषित करने की जरूरत

list1.removeAll (List2) ;

+1

इसे ऊपर उठाना क्योंकि यह एकमात्र उत्तर है जो स्पष्ट रूप से उल्लेख करता है कि सूची में मौजूद वर्गों में बराबर विधि को ओवरराइड करने की आवश्यकता है। यह कुछ लोगों के लिए स्पष्ट नहीं हो सकता है और हटा सकता है अगर आपके कस्टम वर्गों के लिए बराबर लागू नहीं किया गया है तो बस उम्मीद के अनुसार काम नहीं करेगा। – ioss

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