Как изменить строки на столбцы в ArrayList <Integer []> - PullRequest
7 голосов
/ 09 января 2012

Как изменить строки на столбцы в ArrayList<Integer[]>?Например:

ArrayList<Integer[]> arr = ArrayList<Integer[]>();
arr.add(new Integer[]{1,2,3});
arr.add(new Integer[]{4,5,6});

Должно быть:

[1]: 1 4
[2]: 2 5
[3]: 3 6

Если это невозможно с ArrayList, каковы другие варианты хранения 2D-данных и изменения строк в столбцы?

Ответы [ 5 ]

9 голосов
/ 09 января 2012

Что-то не так с int[][]? Это был бы стандартный подход:

public static void main(String[] args) {
    int[][] table = new int[][] { { 1, 2, 3 }, { 4, 5, 6 } };

    // This code assumes all rows have same number of columns
    int[][] pivot = new int[table[0].length][];
    for (int row = 0; row < table[0].length; row++)
        pivot[row] = new int[table.length];

    for (int row = 0; row < table.length; row++)
        for (int col = 0; col < table[row].length; col++)
            pivot[col][row] = table[row][col];

    for (int row = 0; row < pivot.length; row++)
        System.out.println(Arrays.toString(pivot[row]));
}

Выход:

[1, 4]
[2, 5]
[3, 6]


Если вы должны использовать Коллекции, используйте для начала:

List<List<Integer>> table = new ArrayList<List<Integer>>();
table.add(Arrays.asList(1, 4));
table.add(Arrays.asList(2, 5));
table.add(Arrays.asList(3, 6));
3 голосов
/ 09 января 2012

Эта проблема называется ' Matrix Transpose '.Если вы заранее знаете количество строк, вы можете просто использовать 2D-матрицу и просто транспонировать ее, как показано ниже:

Integer[][] matrix = new Integer[rows][cols];
//Let i = 2 (rows); j = 3 (cols)
matrix[0] = new Integer[]{1,2,3};
matrix[1] = new Integer[]{4,5,6};

Integer[][] transposedMatrix = new Integer[cols][rows];

for(int i=0;i<cols;i++) {
   for(int j=0;j<rows;j++) {
      transposedMatrix[i][j] = matrix[j][i];
   }
}

Даже если вы заранее не знаете количество строк или столбцов, вы можетеиспользуйте другие структуры данных, такие как ArrayList, а затем используйте ту же логику, что и выше.

2 голосов
/ 09 января 2012

Вы можете использовать два цикла - что-то вроде этого должно работать:

ArrayList<Integer[]> res = ArrayList<Integer[]>();
int C = arr.get(0).length;
int R = arr.size();
for (int c = 0 ; c != C ; c++) {
    int[] row = new Integer[R];
    for (int r = 0 ; r != R ; r++) {
        row[r] = arr.get(R)[c];
    }
    res.add(row);
}
1 голос
/ 09 января 2012
ArrayList<Integer[]> arr = new ArrayList<Integer[]>();
    arr.add(new Integer[]{1,2,3});
    arr.add(new Integer[]{4,5,6});

    ArrayList<Integer[]> res = new ArrayList<Integer[]>();

    int C = arr.get(0).length;
    int R = arr.size();
    for (int c = 0 ; c != C ; c++) {
        Integer[] row = new Integer[R];
        for (int r = 0 ; r < R ; r++) {
            row[r] = arr.get(r)[c];
        }
        res.add(row);
    }
0 голосов
/ 09 января 2012

Вы можете попробовать Map.

Как,

Map<Integer, Integer[]> newMap = new HashMap<Integer, Integer[]>();
newMap.put(1, new Integer[]{1,4});
newMap.put(2, new Integer[]{2,5});

чтобы отсортировать,

Map<Integer, Integer[]> sortedMap = new TreeMap<Integer, Integer[]>(newMap);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...