2015-01-21 143 views
3

我有一個方法試圖轉置ArrayList包含一個ArrayList的字符串,名爲矩陣並返回新的數組。我發現Transposing Values in Java 2D ArrayList,但它看起來像是數組而不是ArrayList。我的2D陣列具有未知尺寸,可能是矩形或可能不規則(但從不是方形)。Transpose ArrayList <ArrayList <String>> in Java

我的想法是讀取每個內部數組,並將這些項追加到輸出矩陣的內部數組中。

public static ArrayList<ArrayList<String>> transpose (ArrayList<ArrayList<String>> matrixIn){ 
    ArrayList<ArrayList<String>> matrixOut = new ArrayList<>(); 
    //for each row in matrix 
    for (int r = 0; r < matrixIn.size(); r++){ 
     ArrayList<String> innerIn = matrixIn.get(r); 

     //for each item in that row 
     for (int c = 0; c < innerIn.size(); c++){ 

      //add it to the outgoing matrix 

      //get matrixOut current value 
      ArrayList<String> matrixOutRow = matrixOut.get(c); 
      //add new one 
      matrixOutRow.add(innerIn.get(c)); 
      //reset to matrixOut 
      matrixOut.set(c,matrixOutRow); 
     } 
    } 
    return matrixOut; 
} 

我得到一個 「拋出IndexOutOfBoundsException:指數:0,大小:0」 錯誤在

 //get matrixOut[v] 
     ArrayList<String> matrixOutRow = matrixOut.get(v); 

我在做什麼不對的事嗎?

+1

'size:0'表示列表中沒有元素。 – 2015-01-21 00:35:27

+1

這是編譯? ArrayList > matrixOut = new ArrayList <>();和matrixOut是空列表 – nayakam 2015-01-21 00:43:01

回答

2

假設:每個內部列表都有相同的元素數目。這可以幫助你。

public static List<List<String>> transpose(ArrayList<ArrayList<String>> matrixIn) { 
    List<List<String>> matrixOut = new ArrayList<List<String>>(); 
    if (!matrixIn.isEmpty()) { 
     int noOfElementsInList = matrixIn.get(0).size(); 
     for (int i = 0; i < noOfElementsInList; i++) { 
      List<String> col = new ArrayList<String>(); 
      for (List<String> row : matrixIn) { 
       col.add(row.get(i)); 
      } 
      matrixOut.add(col); 
     } 
    } 

    return matrixOut; 
} 
+0

感謝您的幫助,但我不能認爲內部數組將具有相同的長度。你的變量名稱的確讓我想到了構建一個消除鋸齒狀數組的方法 - 但是最終導致出現了一些嘗試/捕獲超出界限的錯誤。新代碼將在下面發佈。 – 2015-01-23 20:52:11

0

在這裏回答我自己的問題。這是我現在正在做的:

public static ArrayList<ArrayList<String>> transpose (ArrayList<ArrayList<String>> matrixIn){ 
    ArrayList<ArrayList<String>> matrixOut = new ArrayList<>(); 
    int rowCount = matrixIn.size(); 
    int colCount = 0; 

    //find max width 
    for(int i = 0; i < rowCount; i++){ 
     ArrayList<String> row = matrixIn.get(i); 
     int rowSize = row.size(); 
     if(rowSize > colCount){ 
      colCount = rowSize; 
     } 
    } 
    //for each row in matrix 
    for (int r = 0; r < rowCount; r++){ 
     ArrayList<String> innerIn = matrixIn.get(r); 

     //for each item in that row 
     for (int c = 0; c < colCount; c++){ 

      //add it to the outgoing matrix 
      //get matrixOut[c], or create it 
      ArrayList<String> matrixOutRow = new ArrayList<>(); 
      if (r != 0) { 
       try{ 
        matrixOutRow = matrixOut.get(c); 
       }catch(java.lang.IndexOutOfBoundsException e){ 
        System.out.println("Transposition error!\n" 
          + "could not get matrixOut at index " 
          + c + " - out of bounds" +e); 
        matrixOutRow.add(""); 
       } 
      } 
      //add innerIn[c] 
      try{ 
       matrixOutRow.add(innerIn.get(c)); 
      }catch (java.lang.IndexOutOfBoundsException e){ 
       matrixOutRow.add(""); 
      } 

      //reset to matrixOut[c] 
      try { 
       matrixOut.set(c,matrixOutRow);     
      }catch(java.lang.IndexOutOfBoundsException e){ 
       matrixOut.add(matrixOutRow); 
      } 
     } 
    } 
    return matrixOut; 
} 

我不能假設光滑的數組,我還想返回嵌套的ArrayList。所以,現在我只需找到最大尺寸並通過添加「」來捕捉所有超出界限的錯誤。

我敢肯定,有一種更清潔的方式,但這似乎工作。

相關問題