सूची <string> ArrayList <string> रूपांतरण मुद्दा


91

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

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>>

इसलिए यह विधि सूची देता है और मुझे एक सरणी की आवश्यकता है? अगर मैं इसे डालने की कोशिश करता हूं तो यह कसरत नहीं करता ... कोई सुझाव?

इसके अलावा, अगर मैं किसी HashMap में ArrayList को List में बदल दूं, तो मुझे मिल जाएगा

java.lang.UnsupportedOperationException

मेरे कोड में इस लाइन के कारण

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

कोई बेहतर सुझाव?

जवाबों:


53

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

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

के बजाय:

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

इसे इस्तेमाल करे:

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

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

191

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

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

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

new ArrayList<String>(myList);

41

ArrayList # addAll (संग्रह) पर एक नज़र डालें

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

तो मूल रूप से आप उपयोग कर सकते हैं

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);

12

कोटलिन लिस्ट में इसे एक कंस्ट्रक्टर पैरामीटर के रूप में पारित करके एरियरिस्ट में परिवर्तित किया जा सकता है।

ArrayList(list)

5

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

यदि आप ArrayListविशिष्ट जानकारी का उपयोग करना चाहते हैं, तो आपको ArrayList में कनवर्ट करना होगा

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

0

कोशिश की और परीक्षण किया दृष्टिकोण।

public static ArrayList<String> listToArrayList(List<Object> myList) {
        ArrayList<String> arl = new ArrayList<String>();
        for (Object object : myList) {
            arl.add((String) object);
        }
        return arl;

    }
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.