2017-03-02 80 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

是的,需要對轉換完成稍作修改...完成。應該使用通用轉換。 –