【问题标题】:How can I convert List<List<String>> into String[][]?如何将 List<List<String>> 转换为 String[][]?
【发布时间】:2013-08-26 18:36:34
【问题描述】:

在我的项目中,我有一个 List,其中包含 Lists 的 Strings (List&lt;List&lt;String&gt;&gt;),现在我必须将此 List 转换为 String 数组 (String[][]) )。

如果我有一个List&lt;String&gt;(例如myList),那么我可以这样做以转换为String[]

String[] myArray = new String[myList.size()];
myArray = myList.toArray(myArray);

但在这种情况下,我在ListListStrings)中有很多 ListString。 我怎样才能做到这一点?我花了很多时间,但我没有找到解决方案..

【问题讨论】:

  • 问题应该表现出一些努力,所以我建议你采取你认为是你最大的努力,并发布一些关于你尝试了什么以及出了什么问题的信息。
  • 好的,谢谢..但我真的不知道该怎么做..

标签: java arrays string list arraylist


【解决方案1】:

几天前我写了一个通用实用程序方法供我自己使用,它将List&lt;List&lt;T&gt;&gt; 转换为T[][]。这是方法。您可以将其用于您的目的:

public static <T> T[][] multiListToArray(final List<List<T>> listOfList, 
                                         final Class<T> classz) {
    final T[][] array = (T[][]) Array.newInstance(classz, listOfList.size(), 0);

    for (int i = 0; i < listOfList.size(); i++) {
        array[i] = listOfList.get(i).toArray((T[]) Array.newInstance(classz, listOfList.get(i).size()));
    }

    return array;
}

我已经使用Array#newInstance() 方法创建了数组,因为您不能直接创建类型参数T 的数组。

由于我们正在创建一个二维数组,而且我们还不知道您将拥有多少列,所以我最初将列大小指定为 0。无论如何,代码在 for 循环中使用一个新数组初始化每一行。所以,你不必担心。

这一行:

array[i] = listOfList.get(i).toArray((T[]) Array.newInstance(classz, listOfList.get(i).size()));

使用List#toArray(T[]) 方法将内部列表转换为数组,就像您已经做过的那样。我只是将一个数组作为参数传递给该方法,因此我得到的返回值为T[],我可以直接将其分配给当前行 - array[i]

现在您可以将这种方法用作:

String[][] arr = multiListToArray(yourList, String.class);

感谢@arshaji,您可以修改泛型方法以将未初始化的数组作为第二个nd 参数传递,而不是Class&lt;T&gt;

public static <T> void multiListToArray(final List<List<T>> listOfList, 
                                        final T[][] arr) {
    for (int i = 0; i < listOfList.size(); ++i) {
        arr[i] = listOfList.get(i).toArray(arr[i]);
    }
}

但是,你必须像这样将数组传递给这个方法:

List<List<String>> list = new ArrayList<>();
// Initialize list
String[][] arr = new String[list.size()][0];
multiListToArray(list, arr);

请注意,由于现在我们将数组作为参数传递,因此您不再需要从方法中返回它。在数组中所做的修改会在调用代码中反映到数组中。

【讨论】:

  • 当我看到这个问题时,我记得你的代码审查。非常好的答案(方法)。
  • +1 虽然如果我在写这个,我会传递一个要填充的数组而不是 Class 实例给方法。
  • @arshajii。好主意。我会尝试一下,并发布它,如果让它工作的话。谢谢:)
  • @arshajii。那仍然需要我将Class&lt;T&gt; 作为参数传递。这将需要创建内部数组,其类型为T
  • 你不应该这样做。 array 是参数,在 for 循环中,array[i] = listOfList.get(i).toArray(array[i])
【解决方案2】:
 String[][] myArray  = new String[myList.size()][];
 for (int i = 0; i < myList.size(); i++) {
         List<String> row = myList.get(i);
         myArray[i] = row.toArray(new String[row.size()]);
 }

【讨论】:

  • 我只想把ArrayList&lt;String&gt;改成List&lt;String&gt;
【解决方案3】:

要初始化String[][],你应该初始化String[]的列表(数组)

所以你需要定义一个列表

List<String[]>  string = new List<String[]>();
for (int i = 0;....)
{
String[] _str = new String[numbers];
_str[0] = ...
string.append(_str);
}

【讨论】:

    【解决方案4】:

    这是一种方法

    List<List<String>> list = new ArrayList<List<String>>();
    String[][] array = new String[list.size()][];
    
    int counter1 = 0;
    
    for(List<String> outterList : list)
    {
        array[counter1] = new String[outterList.size()];
        int counter2 = 0;
    
        for(String s : outterList)
        {
            array[counter1][counter2] = s;
            counter2++;
        }
    
        counter1++;
    }
    

    【讨论】:

    • 哎呀,人们不喜欢传统的方式:)
    猜你喜欢
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2021-09-17
    • 2021-01-13
    • 1970-01-01
    • 2021-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多