2017-03-02 82 views
1

我有保存数组列表的列表,我希望它转换成多维数组:如何将多维列表转换为java中的多维数组?

/* 
The logs looks something like this 
[Name: Foo, From: Somewhere, To: Somewhere] 
[Name: Foo1, From: Somewhere1, To: Somewhere1] 
[Name: Foo2, From: Somewhere2, To: Somewhere2] 
... 
*/ 

public static void main(String[] args) { 
    List<ArrayList<String>> items = new ArrayList<>(); 

    for (String logs : Reader.read(App.purchaseLog, true) /* helper method */) { 
    String[] singleLog = convert(logs); /* helper method */ 

    items.add(new ArrayList<String>()); 

    for (String data : singleLog) { 
     String removeBrackets = data.replaceAll("\\[", "").replaceAll("\\]", ""); 

     String[] splitSingleLog = convert(removeBrackets.split(",")); 
     for (String element : splitSingleLog) { 
      String trimmedData = element.trim(); 
      items.get(0).add(trimmedData.substring(trimmedData.indexOf(':') + 2, trimmedData.length())); 
     } 
    } 
} 

    // But then how can i convert it to normal 2 dimensional array? 
    // i am expecting it to be like this 
    String[][] data = { 
     {"Foo", "Somewhere", "Somewhere"}, 
     {"Foo1", "Somewhere1", "Somewhere1"}, 
     {"Foo2", "Somewhere2", "Somewhere2"} 
    }; 
} 

public static String[] convert(String... array) { 
    return array; 
} 

我怎么能每次循环的ArrayList,改变成正常的排列? 我看到的ArrayList转换到一个数组的几个例子,但它主要是一维数组(Convert ArrayList<String> to String[] array

+0

谁downvoted并要求关闭?这个问题完全在SO的范围内。 –

+0

@ Jean-BaptisteYunès很明显,我没有倒下,关闭请求:但是......最后,这个问题实际上是基础知识。我不觉得其他用户宁愿去关闭这个。 – GhostCat

+0

我对此没有收费......甚至基础知识都值得回答,特别是对于初学者。 –

回答

1

看来你不明白多暗淡阵列在Java中是如何工作的。它们不是真实的矩阵。一个数组的数组...表示:包含另一个1-dim数组的1-dim数组。

只需将您的List<Whatever>转换为Whatever[];然后你可以去这样做:

Whatever[][] twodim = { row1, row2 }; 

或动态:

Whatever[][] twodim = new Whatever[numberOfRows][]; 
twodim[0] = row1; 
twodim[1] = row2; 
... 

因此,转换List<List<String>>到两维数组的工作原理是:

List<List<String>> theStrings ... coming from somewhere 
String[][] stringsAsArray = new String[theStrings.length][]; 
for (int i=0; i<theStrings.length;i++) { 
    List<String> aList = theStrings.get(i); 
    stringsAsArray[i] = aList.toArray(new String[aList.size()]); 
} 

但是:你为什么想这样做?正如你刚才看到的那样:这些多光暗阵列很复杂;与List相比非常不灵活。并看看你的数据:你的问题实际上是你使用特定类型的而不是。换句话说:如果你有一些概念上属于一起的价值观,比如一些“物品”; heck:然后创建一个Item类,它可以保存属于一起的值。所以,而不是处理List<List<String>>你正在处理List<Item>而不是!

这就是你应该如何处理你的问题:退一步;并创建一个帮助面向对象模型您的数据。实质上,你不应该问“如何创建多个暗淡的字符串和东西的数组”,而是“我该如何避免确切的”?

+0

如果您使用需要二维数组字符串的库,则可能无法避免它,那么您可能需要将自己的结构转换为所请求的结构。所以你的回答并不能回答原来的问题。 –

+0

我不希望OP删除他的接受,但你的答案并不解释如何将列表转换为二维数组。 –

+1

@ Jean-BaptisteYunès好的,我的答案也加了一部分。 – GhostCat

1

您需要两个步骤,首先将您的List<List<X>>转换为List<X[]>,然后再转换为X[][]。例如:

List<List<X>> listOfList = ...; 

List<X[]> listOfArray a = new ArrayList<X[]>(); 
for (List<X> listOfXx : listOfList) listOfArray.add(listOfX.toArray(new X[0])); // fill with arrays (from inner lists) 

X[][] arrayOfArray = listOfArray.toArray(new X[0][0]); 
+0

我得到java.lang.ClassCastException:[Ljava.lang.Object;无法转换为[Ljava.lang.String – densityx

+0

是的,需要对转换完成稍作修改...完成。应该使用通用转换。 –