Saya jadi bingung tentang array 2D di Swift. Izinkan saya menjelaskan langkah demi langkah. Dan bisakah Anda mengoreksi saya jika saya salah.
Pertama-tama; deklarasi array kosong:
class test{
var my2Darr = Int[][]()
}
Kedua, isi larik. (seperti di my2Darr[i][j] = 0
mana i, j adalah variabel loop-for)
class test {
var my2Darr = Int[][]()
init() {
for(var i:Int=0;i<10;i++) {
for(var j:Int=0;j<10;j++) {
my2Darr[i][j]=18 /* Is this correct? */
}
}
}
}
Dan Terakhir, Mengedit elemen in array
class test {
var my2Darr = Int[][]()
init() {
.... //same as up code
}
func edit(number:Int,index:Int){
my2Darr[index][index] = number
// Is this correct? and What if index is bigger
// than i or j... Can we control that like
if (my2Darr[i][j] == nil) { ... } */
}
}
var my2DArray = Array(count: 10, repeatedValue: Array(count: 10, repeatedValue: 18))
Dan Anda harus benar-benar meningkatkan ke versi beta yang lebih baru.Int[][]()
sintaks tidak lagi valid. Sudah diubah menjadi[[Int]]()
.Jawaban:
Tentukan larik yang bisa berubah
ATAU:
ATAU jika Anda membutuhkan larik dengan ukuran yang telah ditentukan (seperti yang disebutkan oleh @ 0x7fffffff di komentar):
Ubah elemen di posisi
ATAU
Ubah sub array
ATAU
ATAU
Jika Anda memiliki larik 3x2 berisi 0 (nol) sebelum perubahan ini, sekarang Anda memiliki:
Jadi ketahuilah bahwa sub larik bisa berubah dan Anda bisa mendefinisikan kembali larik awal yang mewakili matriks.
Periksa ukuran / batasan sebelum mengakses
Catatan: Aturan markup yang sama untuk array dimensi 3 dan N.
sumber
arr
definisikan seperti pada jawaban makamyVar
harus Int, bukan?var arr = Int(repeating: Int(repeating: 0, count: 2), count: 3)
var arr = Array(count: 2, repeatedValue: Array(count: 3, repeatedValue: 0))
Dari dokumen:
Anda dapat membuat larik multidimensi dengan memasang pasangan tanda kurung siku, di mana nama jenis dasar elemen dimuat dalam pasangan paling dalam dari tanda kurung siku. Misalnya, Anda dapat membuat larik tiga dimensi dari bilangan bulat menggunakan tiga kumpulan tanda kurung siku:
Saat mengakses elemen dalam larik multidimensi, indeks subskrip paling kiri merujuk ke elemen pada indeks tersebut di larik terluar. Indeks subskrip berikutnya di sebelah kanan mengacu pada elemen pada indeks itu dalam larik yang bertingkat satu tingkat. Dan seterusnya. Ini berarti bahwa pada contoh di atas, array3D [0] mengacu pada [[1, 2], [3, 4]], array3D [0] [1] mengacu pada [3, 4], dan array3D [0] [1 ] [1] mengacu pada nilai 4.
sumber
Jadikan Generic Swift 4
sumber
Anda harus berhati-hati saat menggunakan
Array(repeating: Array(repeating: {value}, count: 80), count: 24)
.Jika nilainya adalah sebuah objek, yang diinisialisasi oleh
MyClass()
, maka mereka akan menggunakan referensi yang sama.Array(repeating: Array(repeating: MyClass(), count: 80), count: 24)
tidak membuat instance baruMyClass
di setiap elemen array. Metode ini hanya membuatMyClass
sekali dan memasukkannya ke dalam array.Berikut cara yang aman untuk menginisialisasi array multidimensi.
sumber
Array(repeating: {value}, could 80)
dengan kawat gigi{value}
? Itu akan menciptakan serangkaian penutupan, bukan?{value}
meta-notation untuk "beberapa nilai tipe AnyObject" (tipe referensi)?Di Swift 4
sumber
Menurut dokumen Apple untuk swift 4.1 Anda dapat menggunakan struct ini dengan mudah untuk membuat array 2D:
Tautan: https://developer.apple.com/library/content/documentation/Swift/Conceptual/Swift_Programming_Language/Subscripts.html
Contoh kode:
sumber
Array(repeating:count:)
. Lihat komentar yang saya posting ke jawaban Anda yang lain.Sebelum menggunakan array multidimensi di Swift, pertimbangkan dampaknya terhadap kinerja . Dalam pengujian saya, array yang diratakan berkinerja hampir 2x lebih baik daripada versi 2D:
Waktu eksekusi rata-rata untuk mengisi Array 50x50: 82.9ms
vs.
Waktu eksekusi rata-rata untuk mengisi Array 2D 50x50: 135ms
Kedua algoritma tersebut adalah O (n ^ 2), jadi perbedaan waktu eksekusi disebabkan oleh cara kita menginisialisasi tabel.
Terakhir, hal terburuk yang dapat Anda lakukan adalah
append()
menambahkan elemen baru. Itu terbukti paling lambat dalam pengujian saya:Waktu eksekusi rata-rata untuk mengisi Array 50x50 menggunakan append (): 2.59 d
Kesimpulan
Hindari array multidimensi dan gunakan akses menurut indeks jika kecepatan eksekusi penting. Array 1D lebih berkinerja, tetapi kode Anda mungkin sedikit lebih sulit untuk dipahami.
Anda dapat menjalankan tes kinerja sendiri setelah mengunduh proyek demo dari repo GitHub saya: https://github.com/nyisztor/swift-algorithms/tree/master/big-o-src/Big-O.playground
sumber
Ini bisa dilakukan dalam satu baris sederhana.
Cepat 5
Anda juga dapat memetakannya ke instance dari kelas atau struct pilihan Anda
sumber