2012-10-30 17 views
44

मेरे पास एक निम्न विधि है ... जो वाकई वाक्यों की सूची लेती है और प्रत्येक वाक्य को शब्दों में विभाजित करती है। संदेश यह है:सूची <String> ArrayList <String> रूपांतरण समस्या

public List<String> getWords(List<String> strSentences){ 
allWords = new ArrayList<String>(); 
    Iterator<String> itrTemp = strSentences.iterator(); 
    while(itrTemp.hasNext()){ 
     String strTemp = itrTemp.next(); 
     allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+"));   
    } 
    return allWords; 
} 

मैं एक निम्न स्वरूप

HashMap<String, ArrayList<String>> 

तो इस विधि रिटर्न सूची और मैं एक ArrayList की जरूरत है एक hashmap में यह सूची पारित करने के लिए? अगर मैं इसे कास्ट करने की कोशिश करता हूं तो यह कसरत नहीं करता ... कोई सुझाव?

इसके अलावा, अगर मैं ArrayList एक HashMap में सूची को बदलने के लिए, मैं

java.lang.UnsupportedOperationException 

मेरी कोड

sentenceList.add(((Element)sentenceNodeList.item(sentenceIndex)).getTextContent()); 

कोई बेहतर सुझाव में इस लाइन की वजह से मिलता है?

उत्तर

33

सबसे पहले इस्तेमाल कर सकते हैं, क्यों नक्शा HashMap<String, ArrayList<String>> है और HashMap<String, List<String>> नहीं है? क्या कोई कारण है कि मान इस मामले में इंटरफ़ेस List (ArrayList) का विशिष्ट कार्यान्वयन क्यों होना चाहिए?

Arrays.asList एक java.util.ArrayList वापस नहीं करता है, तो आप प्रकार ArrayList के एक चर के लिए Arrays.asList की वापसी मान निर्दिष्ट नहीं कर सकते हैं।

बजाय:

allWords = Arrays.asList(strTemp.toLowerCase().split("\\s+")); 

इस प्रयास करें:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+"))); 
+2

और विशेष रूप से 'UnsupportedOperationException' के कारण होता है क्योंकि' Arrays.asList' विधि एक रिटर्न एक सरणी द्वारा समर्थित निश्चित आकार की सूची - इसे संशोधित नहीं किया जा सकता है। @ जेस्पर द्वारा प्रस्तुत समाधान उस से बच जाएगा। –

+0

धन्यवाद ... यह हल हो गया है – Skipper07

4

Arrays.asListjava.util.ArrayList का उदाहरण वापस नहीं करता है लेकिन यह java.util.Arrays.ArrayList का उदाहरण देता है।

आप ArrayList विशिष्ट जानकारी का उपयोग करने

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+"))); 
100

कास्ट चाहते हैं तो आप ArrayList में बदलने की आवश्यकता होगी काम करता है जहां सूची की वास्तविक उदाहरण एक ArrayList है। यदि ऐसा है, तो Vector (जो List का एक और विस्तार है) यह क्लासकास्ट अपवाद फेंक देगा।

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

पुराने की सामग्री के साथ एक नया ArrayList बनाएं।

new ArrayList<String>(myList); 
+1

निजी तौर पर लगता है कि यह सबसे पठनीय जवाब – SARose

20

आदेश है कि वे निर्दिष्ट संग्रह का इटरेटर द्वारा दिया जाता है, ArrayList#addAll(Collection)

के अंत इस सूची में निर्दिष्ट संग्रह में सभी तत्त्व जोड़ता पर एक नजर डालें। यदि ऑपरेशन प्रगति में है, तो निर्दिष्ट ऑपरेशन को संशोधित किया गया है, तो इस ऑपरेशन का व्यवहार अपरिभाषित है। (इसका मतलब है कि इस कॉल के व्यवहार अपरिभाषित है अगर निर्दिष्ट संग्रह इस सूची है, और इस सूची अरिक्त है।)

तो बुनियादी तौर पर आप सभी की

ArrayList<String> listOfStrings = new ArrayList<>(list.size()); 
listOfStrings.addAll(list); 
संबंधित मुद्दे