2012-10-30 48 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的格式如下

HashMap<String, ArrayList<String>> 

所以這個方法返回列表,我需要一個ArrayList的?如果我試圖施展它不鍛鍊...任何建議?

另外,如果我改變ArrayList的一個HashMap中列出,我得到

java.lang.UnsupportedOperationException 

,因爲這條線在我的代碼

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

什麼更好的建議呢?

回答

33

首先,爲什麼是地圖HashMap<String, ArrayList<String>>而不是HashMap<String, List<String>>?是有一些原因的值必須(在這種情況下ArrayList)具體的實現接口List的?

Arrays.asList不會返回java.util.ArrayList,所以您不能將Arrays.asList的返回值分配給類型爲ArrayList的變量。

相反的:

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

試試這個:

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

而具體的'UnsupportedOperationException'造成因爲'Arrays.asList'方法返回一個由數組支持的固定大小的列表 - 它不能被修改。這個由@Jesper提供的解決方案將避免這種情況。 –

+0

謝謝......它解決了 – Skipper07

4

Arrays.asList不返回java.util.ArrayList的實例,但它返回java.util.Arrays.ArrayList的實例。

,如果你想訪問ArrayList具體信息

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

投你將需要轉換爲ArrayList的工作,其中列表的實際情況是ArrayList。如果是這樣,就是說,一個Vector(這是List另一個分機),它會拋出ClassCastException。

更改HashMap定義時的錯誤是由於稍後正在處理元素,並且該過程需要一個僅在ArrayList中定義的方法。異常告訴你它沒有找到它正在尋找的方法。

創建一個新的ArrayList與舊的內容。

new ArrayList<String>(myList); 
+1

個人覺得這是最可讀的答案 – SARose

20

看看ArrayList#addAll(Collection)

追加所有指定集合中的元素的 年底這個名單的,因爲它們是由指定 集合的迭代器返回的順序。如果 指定的集合被修改,操作中 正在進行此操作的行爲是不確定的。 (這意味着,此調用的行爲是不確定的,如果 指定的collection是此列表,這個列表是空的。)

所以基本上你可以使用所有的

ArrayList<String> listOfStrings = new ArrayList<>(list.size()); 
listOfStrings.addAll(list); 
相關問題