2015-01-21 5 views
3

У меня есть метод, пытающийся перенести ArrayList, содержащий ArrayList строки, называемый матрицей и возвращающий новый массив.Transpose ArrayList <ArrayList <String>> в Java

Я нашел Transposing Values in Java 2D ArrayList, но похоже, что это для массивов, а не для ArrayLists. Мой 2D-массив имеет неизвестные размеры, прямоугольные или, возможно, нерегулярные (но никогда не квадратные).

Моя идея состояла в том, чтобы прочитать каждый внутренний массив и добавить элементы во внутренние массивы исходящей матрицы.

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

'размер: 0' означает, что в списке нет элементов. –

+1

Является ли это компиляция? ArrayList > matrixOut = new ArrayList <>(); и matrixOut - пустой список – nayakam

ответ

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

Спасибо за помощь, но я не могу предположить, что внутренние массивы будут иметь одинаковую длину. Ваши имена переменных заставили меня задуматься о создании метода сглаживания зубчатых массивов, но в итоге добавили кучу попыток/уловов для ошибок за пределами границ. Новый код будет опубликован ниже. –

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. Итак, теперь я просто нахожу максимальные размеры и выхватываю все ошибки за пределы, добавляя «».

Я уверен, что есть более чистый способ, но это, похоже, работает.

Смежные вопросы