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

所以这个方法返回List,我需要一个arrayList吗?如果我尝试投射,那将不起作用...有什么建议吗?

另外,如果我将HashMap中的ArrayList更改为List,我会得到

java.lang.UnsupportedOperationException

因为我的代码中有这一行

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

还有更好的建议吗?

Answers:


53

首先,为什么地图是aHashMap<String, ArrayList<String>>而不是a HashMap<String, List<String>>?是否有某些原因为什么值必须是接口的特定实现ListArrayList在这种情况下)?

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方法返回由数组支持的固定大小的列表而导致的-无法对其进行修改。@Jesper在此处提出的解决方案将避免这种情况。
邓肯·琼斯

191

在列表的实际实例为的情况下,Cast起作用ArrayList。如果是,例如a Vector(这是List),它将抛出ClassCastException。

更改HashMap的定义时发生错误是由于稍后要处理元素,并且该过程需要仅在中定义的方法ArrayList。异常告诉您它没有找到要查找的方法。

ArrayList用旧内容创建一个新内容。

new ArrayList<String>(myList);

41

看看ArrayList#addAll(Collection)

按照指定集合的​​Iterator返回的顺序,将指定集合中的所有元素追加到此列表的末尾。如果在操作进行过程中修改了指定的集合,则此操作的行为是不确定的。(这意味着如果指定的集合是此列表,并且此列表是非空的,则此调用的行为是不确定的。)

所以基本上你可以使用

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



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;

    }
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.