Обмен строк двойного 2d массива Java - PullRequest
0 голосов
/ 14 мая 2018

Я пытаюсь написать метод в Java, который позволит мне поменять местами 2d-массив типа double. Мой код отлично работает, когда я использую его для двумерного массива целых, но он не работает при применении к double. Я пропускаю что-то фундаментальное в двойных типах данных? Любое понимание очень ценится.

// swapRows
// double[][] Integer -> double[][]

public static double[][] swapRows(double[][] a, int i)
{
   double[] temp = a[i];

   for(; i < a.length - 1; i++)
      a[i] = a[i+1];

   a[a.length - 1] = temp;

   return a;

}

// версия 2 с новым 2d массивом

 public static double[][] swapRows(double[][] a, int i)
 {
   double[][] b = new double[a.length][a[0].length];

   double[] temp = a[i];

   for(int k = 0; k < i;k++)
      b[k] = a[k];

   for(; i < a.length - 1; i++)
      b[i] = a[i+1];

   b[b.length - 1] = temp;

   return b;

  }

// обратите внимание, что строки не просто меняются местами, указанная строка i отправляется в конец массива, а каждая вторая строка сдвигается вверх // для 2d массива:

{ {3, 5, 6},
{2, 1, 1},
{9, 0, 4} }

// Я ожидаю, что когда i = 0, метод вернет 2d массив:

{ {2, 1, 1},
{9, 0, 4},
{3, 5, 6} }

// но вместо этого я получаю:

{ {0.0, -29.999996, -38.571428},
{18.999997, 0.0, 0.999999},
{18.0, 29.999996, 36.0} }

// когда я использую int вместо double, я получаю ожидаемый массив

Ответы [ 2 ]

0 голосов
/ 14 мая 2018

Я определил проблему.У меня в основной функции были другие тестовые строки, которые изменяли значение массива до его передачи в метод swapRows.Спасибо за вашу помощь.

0 голосов
/ 14 мая 2018

Поскольку код верен ИМХО, двумерный массив должен быть поврежден ( маловероятно , тот же double[] объект строки в двух строках), или гораздо более вероятно тот факт, что выизменение переданного массива и его возврат также могут указывать на некоторую ошибочную обработку результата.

double[][] a = ...
double[][] b = swapRows(a, i);
// a == b

Версия, которая создает копию, которая изменяется:

public static double[][] swapRows(double[][] a, int i) {
    double[][] result = new double[a.length][];
    for (int j = 0; j < a.lnength; ++j) {
        result[j] = Arrays.copyOf(a[j], a[j].length);
    }

    double[] temp = result[i];
    for(; i < result.length - 1; i++) {
        result[i] = result[i+1];
    }
    result[result.length - 1] = temp;
    return result;
}

double[][] a = { { 1.0, 2.0 }, { 3.0, 4.0 } };
double[][] b = swapRows(a, 0);
assert b[0][0] == 3.0 && b[0][1] == 4.0 && b[1][0] == 1.0 && b[1][1] == 2.0;
System.out.println("result = " + Arrays.deepToString(result));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...