转换列表<list <string>&gt;数组

时间:2016-10-31 07:27:26

标签: java arrays list

我有一个在列表变量中声明的元素,例如:

List<List<String>> textList = new ArrayList<>();

添加元素如:

textList.add(Arrays.asList(p)); //adding elements

我可以在变量中输出元素的唯一方法是使用:

 for(List<String>  s: textList){
      System.out.println(s); }

这样的输出元素:

[He is a boy.]
[He likes apple.]
[She is a girl.]

现在,我想将它们存储在数组中,以便输出时元素看起来像这样。

[He is a boy., He likes apple., She is a girl.]

我已经尝试了

String[] textArr = new String[textList.size()];
textArr = textList.toArray(textArr);

for(String s : textArr){
    System.out.println(s);}

但我收到的错误是:

Exception in thread "main" java.lang.ArrayStoreException
at java.lang.System.arraycopy(Native Method)
at java.util.Arrays.copyOf(Arrays.java:3213)
at java.util.ArrayList.toArray(ArrayList.java:407)

那么,如何使用正确的方法将列表中的元素转换为数组。谢谢!

3 个答案:

答案 0 :(得分:3)

您的问题是您在列表textList中存储字符串。

textList.add(Arrays.asList(p));

如类型所示,这里有一个字符串列表列表。

因此,您无法获取该列表的元素并假设它们是字符串。因为他们不是!错误消息告诉您:toArray()想要它可以放入该字符串数组的字符串,但是你给它一个List of List of String!

但事情是:你在这里描述的内容首先没有意义。 打印字符串不应该关心字符串是否在数组或列表中。

我的意思是:当您手动迭代List或数组以打印其内容时,如果您迭代List或数组绝对无关紧要。代码甚至是相同的:

for (String someString : someCollection) { 
  System.out.println(someString);
}

someCollection 可以是:array或List!

换句话说:将列表中很好的数据转换为打印的数组的想法根本没有任何意义。相反:你可能在List对象上调用 toString(),结果......不是你想要的100%。但我向你保证:在某个数组上调用toString()会导致你完全不想要的东西。

长话短说:忘记转换为数组;只需迭代你的字符串列表列表并使用StringBuilder以你想要的方式收集该集合的内容(你只需将那些[]字符附加到你希望他们看到的那些构建器中。)

(如果你坚持转换到数组,那么要理解的关键点是只有一个String的字符串可以变成一个字符串数组。所以List of List ......不能那么简单。)< / p>

答案 1 :(得分:0)

您可以使用Iterator来遍历列表的每个元素,每个语句的实例(我个人更喜欢迭代器)。您可以使用的代码类似于

         //Your list
    List<List<String>> textList = new ArrayList<>();

    //The iterators
    Iterator<List<String>> itList = textList.iterator();
    Iterator<String> itString;

    //The string to store the phrases
    String s[] = new String[textList.size()];

    int i =0;

    //First loop, this seeks on every list of lists
    while(itList.hasNext()){
        //Getting the iterator of strings
        itString = itList.next().iterator();

        s[i] = "";
        //2nd loop, it seeks on every List of string
        while(itString.hasNext()){
           s[i] = s[i].concat(itString.next());
        }
        s[i] = s[i].concat(".");
        i++;
    }

答案 2 :(得分:0)

使用流和flatMap,您可以这样做:

List<List<String>> list = ...;
String[] strings = list.stream().flatMap(l -> l.stream()).collect(Collectors.toList()).toArray(new String[0]);

这相当于使用循环(您可以使用两个嵌套的for循环,如评论中建议的那样,而不是替换addAll,但为什么?):

List<List<String>> list = ...;
List<String> stringList = new ArrayList<>();
for (List<String> l : list)
  stringList.addAll(l);
String[] strings = list.toArray(new String[stringList.size()]);