klonlash va tahrirlash int [] [] ning java da - int [] [] ni o'zgartira olmaydi

Bu mening kodim:

  public Move makeMove(int[][] board)

(... ko'proq kod ...)

 int[][] nextMove = board.clone(); 
  nextMove[i][j] = 1;
  int nextMaxMove = maxMove( nextMove );        

  System.out.println( next max move: " + nextMaxMove + " " + maxMove( board )  );

int [] [] kartochkasi - bu 8x8 karta va men taxta o'yida eng yaxshi harakatni hisoblashga harakat qilaman.

Men teng huquqli harakatlar ro'yxatini topib olganimda raqibning turli xil harakatlarga qanday imkoniyatlarni berganini tekshirmoqchiman. clone() nextMove [i] [j] = 1 klonini tahrirlang va maxMove < kodi> funktsiyasi.

println disk raskadrovka uchun ishlatilsa va men buni maxMove (nextMove); va maxMove (pog'ona) uchun bir xil natijani qo'lga kiritaman. Bu nextMove o'zgarmadi.

4
Men sizni keyingi mozaikaning tarkibini chop etishingizni yoki o'zgartirilganligini tekshirishni yoki nosozliklarni tuzatuvchida ko'rib chiqishingizni tavsiya qilaman.
qo'shib qo'ydi muallif Peter Lawrey, manba
Bu maxMove funktsiyasi noto'g'ri ekanligini anglatadi ...
qo'shib qo'ydi muallif Ahmed Masud, manba
Arrays.copyOf dan foydalaning.
qo'shib qo'ydi muallif Laf, manba

1 javoblar

Buning sababi, ma'lumotlar tuzilmangiz massivlar qatori bo'lib, u kaput ostida bir qator murojaatlar hisoblanadi. Sizning kloningiz sayoz nusxasi, shuning uchun klon asl nusxalarini o'z ichiga oladi. Ushbu misol kodi buni ko'rsatadi.

    int[][] x = new int[][] { { 1,3 }, { 5,7 }  };
    int[][] copyOfX = x.clone( );
    copyOfX[1][1]=13;

    for ( int i = 0; i < 2; i++ )
    {
        System.out.println(x[i] + "/" + copyOfX[i]);
        for ( int j = 0; j < 2; j++ )
        {
            System.out.println(x[i][j] + "/" + copyOfX[i][j]);
        }
    }

Eritma .clone() dan foydalanishni emas, balki sizning 2 o'lchovli katalogingizning mazmunini aniq nusxalashdir.

2
qo'shib qo'ydi