98

我有一个以下方法......它实际上采用句子列表并将每个句子分成单词。就这个:

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?如果我尝试施放它不会锻炼......有什么建议吗?

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

java.lang.UnsupportedOperationException

因为我的代码中有这一行

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

有更好的建议吗?

4

8 回答 8

204

Cast 在列表的实际实例是ArrayList. 如果是,比如说,a Vector(它是 的另一个扩展List),它将抛出一个 ClassCastException。

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

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

new ArrayList<String>(myList);
于 2012-10-30T08:16:59.337 回答
55

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

Arrays.asList不返回 a java.util.ArrayList,因此您不能将返回值Arrays.asList赋给 type 的变量ArrayList

代替:

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

尝试这个:

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
于 2012-10-30T08:18:26.260 回答
45

看看ArrayList#addAll(Collection)

按照指定集合的​​迭代器返回的顺序,将指定集合中的所有元素附加到此列表的末尾。如果在操作正在进行时修改了指定的集合,则此操作的行为是未定义的。(这意味着如果指定的集合是这个列表,并且这个列表是非空的,那么这个调用的行为是未定义的。)

所以基本上你可以使用

ArrayList<String> listOfStrings = new ArrayList<>(list.size());
listOfStrings.addAll(list);
于 2012-10-30T08:17:56.590 回答
18

在 Kotlin 中,可以通过将 List 作为构造函数参数传递来将其转换为 ArrayList。

ArrayList(list)
于 2019-01-12T08:44:10.350 回答
5

Arrays.asList不返回实例,java.util.ArrayList但返回实例java.util.Arrays.ArrayList

如果要访问ArrayList特定信息,则需要转换为 ArrayList

allWords.addAll(Arrays.asList(strTemp.toLowerCase().split("\\s+")));
于 2012-10-30T08:14:03.753 回答
0

这有点晚了,但想到了一种简单的方法来解决将 List 转换为 ArrayList的问题。

简单的方法

public static <T> ArrayList<T> listToArrayList(List<T> list) {
    return list != null ? new ArrayList<>(list) : null;
}

经典方式

public static  <T> ArrayList<T>  listToArrayList(List<T> list) {
    ArrayList<T> arrayList = new ArrayList<>();
    if (list != null) {
        for (int i = 0; i < list.size(); i++) {
            arrayList.add(list.get(i));
            i++;
        }
        // or simply
        // arrayList.addAll(list);
    }
    return  arrayList;
}

用法

listToArrayList(yourList);
于 2021-04-21T03:56:58.083 回答
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;

    }
于 2019-11-06T17:52:29.297 回答
0

ArrayList listOfStrings = new ArrayList<>(list.length); listOfStrings.addAll(Arrays.asList(list));

如果是对象列表,您可以使用这种方式将 Model[] 列表转换为 ArrayList

于 2022-01-15T15:59:09.790 回答