двумерные массивы и ввод в них другого массива через цикл - PullRequest
0 голосов
/ 30 января 2012

Я пытаюсь создать массив, в котором, по сути, находятся строки secondArr (двумерного массива).проблема в том, что когда мои cScore.size() == 7 (or equal to secondArr.size(), не добавляются в allScore, а в конце всех (в данном случае 21, как myArr.size()=3 и secondArr.size()=7. значения добавляются в один индекс, кто-нибудь знает, почему этокод кажется таким простым, но он мне не удался. В конце я хотел бы получить массив из 3 столбцов и 7 строк (но в этом случае только 1 столбец и 7 строк, и как только я получу это, чтобы работатьзатем я добавлю остальное.)

Мой код выглядит следующим образом (это всего лишь небольшой фрагмент):

    int rowsNum = allScores.size();
    int colsNum = allScores.get(0).size();

    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(colsNum);
    for (int rowIdx = 0; rowIdx < colsNum; rowIdx++) {
        ArrayList<Integer> rows = new ArrayList<Integer>(rowsNum);
        for (int colIdx = 0; colIdx < rowsNum; colIdx++) {  
            rows.add(allScores.get(colIdx).get(rowIdx)); {
    }
            result.add(rows);
    }

// с использованием синтаксиса prov. by msi ....

исходный массив allScores: [[2, 1, 3], [3, 1, 2], [2, 1, 3], [3, 1, 2], [2, 1,3], [3, 1, 2], [1, 2, 3]], когда он транспонируется с этим, он повторяется в [[2, 3, 2, 3, 2, 3, 1], [2, 3,2, 3, 2, 3, 1], [2, 3, 2, 3, 2, 3, 1], [2, 3, 2, 3, 2, 3, 1], [2, 3, 2,3, 2, 3, 1], [2, 3, 2, 3, 2, 3, 1], [2, 3, 2, 3, 2, 3, 1]]

Ответы [ 3 ]

0 голосов
/ 30 января 2012

Я не уверен, где лежит ваша ошибка, но я думаю:

  • может быть, порядок вашего двумерного массива (т.е. это 7 х 3 вместо 7 х 3)
  • действительно ли вам нужно столько ArrayLists для реализации вашего алгоритма
  • улучшить качество вашего кода, например избегая магических чисел (7 вместо size ()), используя расширенный для циклов и утверждения значительно упростят поиск ошибки.
0 голосов
/ 30 января 2012

Я верю, что это то, что вы хотите. Этот код переставляет 2d-массивы, поэтому столбец становится строкой, а строка станет столбцом после транспонирования.

Пример:

[[1 2 3], [4 5 6], [7 8 9]] -> [[1 4 7], [2 5 8], [3 6 9]]

этот код предполагает, что все строки / столбцы имеют одинаковую длину.

    // arr2d is ArrayList<ArrayList<Integer>>
    int rowsNum = arr2d.size();
    int colsNum = arr2d.get(0).size();

    ArrayList<ArrayList<Integer>> result = new ArrayList<ArrayList<Integer>>(colsNum);
    for (int rowIdx = 0; rowIdx < colsNum; rowIdx++) {
        ArrayList<Integer> rows = new ArrayList<Integer>(rowsNum);
        for (int colIdx = 0; colIdx < rowsNum; colIdx++) {
            rows.add(arr2d.get(colIdx).get(rowIdx));
        }
        result.add(rows);
    }

... редактировать (ответ на 1-й комментарий)

Я не понимаю твоей точки зрения. Проверка:

    ArrayList<ArrayList<Integer>> arr2d = new ArrayList<ArrayList<Integer>>();
    arr2d.add(new ArrayList<Integer>(2));
    arr2d.add(new ArrayList<Integer>(2));
    arr2d.add(new ArrayList<Integer>(2));
    arr2d.get(0).add(1);
    arr2d.get(0).add(2);
    arr2d.get(1).add(3);
    arr2d.get(1).add(4);
    arr2d.get(2).add(5);
    arr2d.get(2).add(6);

выше дает вам: [[1, 2], [3, 4], [5, 6]] -> [[1, 3, 5], [2, 4, 6]] преобразование. Нет копий строк или столбцов, о которых вы говорите.

0 голосов
/ 30 января 2012
candScore.add(secondArr.get(j).get(k));

не должно быть:

cScore.add(secondArr.get(j).get(k));

Плюс у меня такое ощущение, что ваши две вложенные циклы должны быть наоборот.

for (int j=0; j< secondArr.size(); j++){
    for (int k=0; k< myArr.size(); k++) { 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...