【问题标题】:List<String> to ArrayList<String> conversion issueList<String> 到 ArrayList<String> 转换问题
【发布时间】:2012-10-19 13:20:21
【问题描述】:

我有一个下面的方法......它实际上获取句子列表并将每个句子分成单词。就是这样:

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,我会得到 ​​p>

java.lang.UnsupportedOperationException

因为我的代码中有这一行

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

有更好的建议吗?

【问题讨论】:

    标签: java list arraylist


    【解决方案1】:

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

    如果你想访问ArrayList的具体信息,你需要转换成ArrayList

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

    【讨论】:

      【解决方案2】:

      Cast 在列表的实际实例是ArrayList 的情况下工作。如果是 Vector(这是 List 的另一个扩展),它将抛出 ClassCastException。

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

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

      new ArrayList<String>(myList);
      

      【讨论】:

        【解决方案3】:

        看看ArrayList#addAll(Collection)

        将指定集合中的所有元素追加到末尾 此列表,按照指定的返回顺序 集合的迭代器。此操作的行为未定义,如果 操作进行时指定的集合被修改 进步。 (这意味着这个调用的行为是未定义的,如果 指定的集合就是这个列表,这个列表是非空的。)

        所以基本上你可以使用

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

        【讨论】:

          【解决方案4】:

          首先,为什么地图是HashMap&lt;String, ArrayList&lt;String&gt;&gt; 而不是HashMap&lt;String, List&lt;String&gt;&gt;?为什么该值必须是接口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+")));
          

          【讨论】:

          • 特别是 UnsupportedOperationException 是因为 Arrays.asList 方法返回一个由数组支持的固定大小的列表 - 它不能被修改。 @Jesper 在这里提出的解决方案将避免这种情况。
          【解决方案5】:

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

          ArrayList(list)
          

          【讨论】:

            【解决方案6】:

            久经考验的方法。

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

            【讨论】:

              【解决方案7】:

              这有点晚了,但想到了一种简单的方法来解决将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);
              

              【讨论】:

                【解决方案8】:

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

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

                【讨论】:

                  猜你喜欢
                  • 1970-01-01
                  • 2018-06-11
                  • 2012-06-06
                  • 2011-09-30
                  • 1970-01-01
                  • 1970-01-01
                  • 2014-07-22
                  • 2017-05-08
                  • 2011-07-24
                  相关资源
                  最近更新 更多