Pertanyaan Apakah x, y dan baris, atribut col dari array dua dimensi mundur?


jika saya memikirkan x, y koordinat pesawat x, y adalah notasi umum untuk pasangan terurut, tetapi jika saya menggunakan array dua-dime saya memiliki myArray [baris] [col] dan baris adalah y dan col adalah x . Apakah itu mundur atau saya hanya berpikir tentang itu salah? Saya berpikir itu akan terlihat seperti myArray [x] [y] tapi itu salah jika saya ingin baris dan kolom yang nyata (seperti di papan permainan.) Bukankah itu myArray [y] [x] untuk benar-benar meniru papan kolom baris ?


32
2018-02-04 21:54


asal


Jawaban:


Anda memilikinya dengan benar, dan rasanya sedikit mundur. nomor baris adalah koordinat y, dan nomor kolom adalah koordinat x, namun kita biasanya menulis baris, col tetapi kita juga biasanya menulis x, y.

Apakah Anda ingin menulis larik Anda sebagai [y] [x] tergantung atau [x] [y] sangat tergantung pada seberapa banyak Anda benar-benar peduli tentang tata letak dalam memori (dan jika Anda melakukannya, bahasa apa yang Anda gunakan). dan apakah Anda ingin menulis fungsi / metode yang dapat beroperasi pada baris atau kolom dalam isolasi.

Jika Anda menulis kode C / C ++, array disimpan di Row Major Order yang berarti bahwa satu baris data dapat diperlakukan sebagai array 1 dimensi. Tetapi satu kolom data tidak bisa. Jika saya ingat dengan benar, VB menggunakan urutan utama kolom, sehingga bahasa bervariasi. Saya akan terkejut dengan C # tidak juga urutan utama, tapi saya tidak tahu.


27
2018-02-04 22:07



Tidak masalah bagaimana Anda menyimpan data Anda dalam array ([x] [y] atau [y] [x]). Yang penting adalah Anda selalu mengulang array dalam cara yang berdekatan. Sebuah array dua dimensi java pada dasarnya adalah array satu dimensi yang menyimpan array kedua (misalnya dalam kasus [y] [x] Anda memiliki array panjang [y] di mana setiap y memegang array [x] yang sesuai untuk itu baris y).

Untuk menjalankan seluruh susunan secara efisien, penting untuk mengakses data dengan cara sehingga Anda tidak harus terus menerus melakukan penelusuran dalam larik tersebut, melompat dari satu y-array-of-xarrays ke y-array-of-xarrays lainnya xarray. Yang ingin Anda lakukan adalah mengakses satu elemen y dan mengakses semua x di sana sebelum pindah ke elemen y berikutnya.

Jadi dalam situasi Array [y] [x]. selalu memiliki variabel pertama di loop luar dan yang kedua di loop bagian dalam:

for (int ys = 0; ys < Array[y].length; ys++)
    for (int xs = 0; xs < Array[y][x].length; xs++)
    {
        do  your stuff here
    }

Dan tentu saja pra-mengalokasikan Array.length keluar dari loop untuk mencegah harus mendapatkan nilai-nilai tersebut setiap siklus.


4
2018-06-29 19:45



Sebenarnya, terserah Anda. Tidak ada hak untuk berpikir dalam pertanyaan Anda. Sebagai contoh saya biasanya memikirkan array satu dimensi sebagai deretan sel. Jadi, dalam pikiran saya itu adalah array [col] [baris]. Tapi itu terserah kamu ...


0
2018-02-04 21:59



Saya yakin ada banyak pendapat berbeda tentang hal ini. Intinya adalah, itu tidak masalah selama Anda konsisten. Jika Anda memiliki pustaka lain atau serupa yang akan menggunakan data yang sama, mungkin masuk akal untuk melakukan apa pun yang mereka lakukan untuk integrasi yang lebih mudah.

Jika ini benar-benar ada dalam kode Anda sendiri, lakukan apa pun yang Anda rasa nyaman. Preferensi pribadi saya adalah menggunakan myArray [y] [x]. Jika mereka besar, mungkin ada manfaat kinerja dari menjaga barang-barang yang akan Anda akses banyak pada saat bersamaan. Tapi saya tidak akan khawatir tentang itu sampai pada tahap yang sangat terlambat jika sama sekali.


0
2018-02-04 22:01



Yah tidak juga, jika Anda menganggap baris sebagai elemen pada sumbu x dan kemudian array 2d adalah sekelompok elemen baris pada sumbu y, maka itu normal untuk menggunakan y untuk beroperasi pada baris, karena Anda sudah tahu x (untuk baris tertentu x selalu sama, itu y yang berubah dengan indeksnya) dan kemudian gunakan x untuk beroperasi pada beberapa elemen baris (baris ditumpuk secara vertikal, masing-masing pada nilai y tertentu)


0
2017-10-25 12:36