F # - Array
Array adalah kumpulan elemen data berurutan dengan ukuran tetap, berbasis nol, dan dapat berubah yang semuanya berjenis sama.
Membuat Array
Anda dapat membuat array menggunakan berbagai sintaks dan cara atau dengan menggunakan fungsi dari modul Array. Pada bagian ini, kita akan membahas pembuatan array tanpa menggunakan fungsi modul.
Ada tiga cara sintaksis untuk membuat array tanpa fungsi -
- Dengan mencantumkan nilai berurutan antara [| dan |] dan dipisahkan oleh titik koma.
- Dengan meletakkan setiap elemen pada baris terpisah, dalam hal ini pemisah titik koma bersifat opsional.
- Dengan menggunakan ekspresi urutan.
Anda dapat mengakses elemen array dengan menggunakan operator titik (.) Dan tanda kurung ([dan]).
Contoh berikut menunjukkan pembuatan array -
//using semicolon separator
let array1 = [| 1; 2; 3; 4; 5; 6 |]
for i in 0 .. array1.Length - 1 do
printf "%d " array1.[i]
printfn" "
// without semicolon separator
let array2 =
[|
1
2
3
4
5
|]
for i in 0 .. array2.Length - 1 do
printf "%d " array2.[i]
printfn" "
//using sequence
let array3 = [| for i in 1 .. 10 -> i * i |]
for i in 0 .. array3.Length - 1 do
printf "%d " array3.[i]
printfn" "
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
1 2 3 4 5 6
1 2 3 4 5
1 4 9 16 25 36 49 64 81 100
Operasi Dasar pada Array
Modul perpustakaan Microsoft.FSharp.Collections.Array mendukung operasi pada array satu dimensi.
Tabel berikut menunjukkan operasi dasar pada Array -
Nilai | Deskripsi |
---|---|
tambahkan: 'T [] →' T [] → 'T [] | Membuat larik yang berisi elemen satu larik diikuti dengan elemen larik lainnya. |
rata-rata: ^ T [] → ^ T | Mengembalikan rata-rata elemen dalam larik. |
averageBy: ('T → ^ U) →' T [] → ^ U | Mengembalikan rata-rata elemen yang dihasilkan dengan menerapkan fungsi ke setiap elemen larik. |
blit: 'T [] → int →' T [] → int → int → unit | Membaca berbagai elemen dari satu larik dan menuliskannya ke larik lain. |
pilih: (opsi 'T → U) →' T [] → 'U [] | Menerapkan fungsi yang disediakan untuk setiap elemen array. Mengembalikan larik yang berisi hasil x untuk setiap elemen yang fungsinya mengembalikan Some (x). |
kumpulkan: ('T →' U []) → T [] → 'U [] | Menerapkan fungsi yang disediakan ke setiap elemen larik, menggabungkan hasil, dan mengembalikan larik gabungan. |
concat: seq <'T []> →' T [] | Membuat larik yang berisi elemen dari setiap urutan larik yang disediakan. |
salin: 'T →' T [] | Membuat larik yang berisi elemen larik yang disediakan. |
buat: int → 'T →' T [] | Membuat array yang semua elemen awalnya adalah nilai yang diberikan. |
kosong: 'T [] | Mengembalikan larik kosong dari tipe yang diberikan. |
ada: ('T → bool) →' T [] → bool | Menguji apakah ada elemen array yang memenuhi predikat yang diberikan. |
keberadaan2: ('T1 →' T2 → bool) → 'T1 [] →' T2 [] → bool | Menguji apakah pasangan elemen yang sesuai dari dua larik memenuhi kondisi yang disediakan. |
isi: 'T [] → int → int →' T → unit | Mengisi berbagai elemen larik dengan nilai yang diberikan. |
filter: ('T → bool) →' T [] → 'T [] | Mengembalikan koleksi yang hanya berisi elemen dari larik yang disediakan yang dikembalikan kondisi yang disediakan true. |
temukan: ('T → bool) →' T [] → 'T | Mengembalikan elemen pertama yang dikembalikan fungsi yang disediakan true. Menambah KeyNotFoundException jika tidak ada elemen seperti itu. |
findIndex: ('T → bool) →' T [] → int | Mengembalikan indeks elemen pertama dalam larik yang memenuhi kondisi yang disediakan. Muncul KeyNotFoundException jika tidak ada elemen yang memenuhi ketentuan. |
fold: ('State →' T → 'State) →' State → 'T [] →' State | Menerapkan fungsi ke setiap elemen array, memasukkan argumen akumulator melalui komputasi. Jika fungsi input adalah f dan elemen array adalah i0 ... iN, fungsi ini menghitung f (... (fs i0) ...) iN. |
fold2: ('State →' T1 → 'T2 →' State) → 'State →' T1 [] → 'T2 [] →' State | Menerapkan fungsi ke pasangan elemen dari dua larik yang disediakan, kiri-ke-kanan, memasukkan argumen akumulator melalui komputasi. Kedua larik masukan harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
foldBack: ('T →' State → 'State) →' T [] → 'State →' State | Menerapkan fungsi ke setiap elemen array, memasukkan argumen akumulator melalui komputasi. Jika fungsi input adalah f dan elemen array adalah i0 ... iN, fungsi ini menghitung f i0 (... (f iN s)). |
foldBack2: ('T1 →' T2 → 'State →' State) → 'T1 [] →' T2 [] → 'State →' State | Menerapkan fungsi ke pasangan elemen dari dua larik yang disediakan, kanan ke kiri, memasukkan argumen akumulator melalui komputasi. Kedua larik masukan harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
forall: ('T → bool) →' T [] → bool | Menguji apakah semua elemen larik memenuhi kondisi yang disediakan. |
forall2: ('T1 →' T2 → bool) → 'T1 [] →' T2 [] → bool | Menguji apakah semua elemen yang sesuai dari dua larik yang disediakan memenuhi kondisi yang disuplai. |
dapatkan: 'T [] → int →' T | Mendapat elemen dari array. |
init: int → (int → 'T) →' T [] | Menggunakan fungsi yang disediakan untuk membuat larik dari dimensi yang disediakan. |
isEmpty: 'T [] → bool | Menguji apakah sebuah array memiliki elemen apa pun. |
iter: ('T → unit) →' T [] → unit | Menerapkan fungsi yang disediakan untuk setiap elemen array. |
iter2: ('T1 →' T2 → unit) → 'T1 [] →' T2 [] → unit) | Menerapkan fungsi yang disediakan untuk sepasang elemen dari indeks yang cocok dalam dua larik. Kedua larik harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
iteri: (int → 'T → unit) →' T [] → unit | Menerapkan fungsi yang disediakan untuk setiap elemen array. Integer yang diteruskan ke fungsi menunjukkan indeks elemen. |
iteri2: (int → 'T1 →' T2 → unit) → 'T1 [] →' T2 [] → unit | Menerapkan fungsi yang disediakan ke sepasang elemen dari indeks yang cocok dalam dua larik, juga meneruskan indeks elemen. Kedua larik harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
panjang: 'T [] → int | Menampilkan panjang larik. Properti Panjang melakukan hal yang sama. |
peta: ('T →' U) → 'T [] →' U [] | Membuat larik yang elemennya merupakan hasil penerapan fungsi yang disediakan ke setiap elemen larik yang disediakan. |
map2: ('T1 →' T2 → 'U) →' T1 [] → 'T2 [] →' U [] | Membuat larik yang elemennya merupakan hasil penerapan fungsi yang disediakan ke elemen terkait dari dua larik yang disediakan. Kedua larik masukan harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
mapi: (int → 'T →' U) → 'T [] →' U [] | Membuat larik yang elemennya merupakan hasil penerapan fungsi yang disediakan ke setiap elemen larik yang disediakan. Indeks integer yang diteruskan ke fungsi menunjukkan indeks elemen yang sedang diubah. |
mapi2: (int → 'T1 →' T2 → 'U) →' T1 [] → 'T2 [] →' U [] | Membuat larik yang elemennya merupakan hasil penerapan fungsi yang disediakan ke elemen yang sesuai dari dua koleksi secara berpasangan, juga meneruskan indeks elemen. Kedua larik masukan harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
maks: 'T [] →' T | Mengembalikan elemen terbesar dari semua larik. Operators.max digunakan untuk membandingkan elemen. |
maxBy: ('T →' U) → 'T [] →' T | Mengembalikan yang terbesar dari semua elemen larik, dibandingkan melalui Operators.max pada hasil fungsi. |
min: ('T [] →' T | Menampilkan elemen terkecil dari semua elemen larik. Operators.min digunakan untuk membandingkan elemen. |
minBy: ('T →' U) → 'T [] →' T | Menampilkan elemen terkecil dari semua elemen larik. Operators.min digunakan untuk membandingkan elemen. |
ofList: 'T list →' T [] | Membuat larik dari daftar yang disediakan. |
ofSeq: seq <'T> →' T [] | Membuat array dari objek enumerable yang disediakan. |
partisi: ('T → bool) →' T [] → 'T [] *' T [] | Membagi larik menjadi dua larik, satu larik berisi elemen yang dikembalikan kondisi yang disediakan true, dan yang lainnya berisi yang dikembalikan false. |
permutasi: (int → int) → 'T [] →' T [] | Mengizinkan elemen array sesuai dengan permutasi yang ditentukan. |
pilih: (Opsi 'T →' U) → 'T [] →' U | Menerapkan fungsi yang disediakan ke elemen berturut-turut dari larik yang disediakan, mengembalikan hasil pertama di mana fungsi mengembalikan Some (x) untuk beberapa x. Jika fungsi tidak pernah mengembalikan Some (x), KeyNotFoundException akan dimunculkan. |
mengurangi: ('T →' T → 'T) →' T [] → 'T | Menerapkan fungsi ke setiap elemen array, memasukkan argumen akumulator melalui komputasi. Jika fungsi input adalah f dan elemen array adalah i0 ... iN, fungsi ini menghitung f (... (f i0 i1) ...) iN. Jika array berukuran nol, ArgumentException akan dimunculkan. |
reduceBack: ('T →' T → 'T) →' T [] → 'T | Menerapkan fungsi ke setiap elemen array, memasukkan argumen akumulator melalui komputasi. Jika fungsi masukan adalah f dan elemennya adalah i0 ... iN, fungsi ini menghitung f i0 (... (f iN-1 iN)). Jika array berukuran nol, ArgumentException akan dimunculkan. |
rev: 'T [] →' T [] | Membalik urutan elemen dalam larik yang disediakan. |
scan: ('State →' T → 'State) →' State → 'T [] →' State []) | Berperilaku seperti lipatan, tetapi mengembalikan hasil antara bersama dengan hasil akhir. |
scanBack: ('T →' State → 'State) →' T [] → 'State →' State [] | Berperilaku seperti foldBack, tetapi mengembalikan hasil perantara bersama dengan hasil akhir. |
set: 'T [] → int →' T → unit | Menetapkan elemen array. |
urutkan: 'T [] →' T [] | Mengurutkan elemen dari sebuah array dan mengembalikan sebuah array baru. Operator.compare digunakan untuk membandingkan elemen. |
sortBy: ('T →' Key) → 'T [] →' T [] | Mengurutkan elemen array dengan menggunakan fungsi yang disediakan untuk mengubah elemen menjadi tipe yang menjadi dasar operasi pengurutan, dan mengembalikan array baru. Operator.compare digunakan untuk membandingkan elemen. |
sortInPlace: 'T [] → unit | Mengurutkan elemen array dengan mengubah array pada tempatnya, menggunakan fungsi perbandingan yang disediakan. Operator.compare digunakan untuk membandingkan elemen. |
sortInPlaceBy: ('T →' Key) → 'T [] → unit | Mengurutkan elemen array dengan mengubah array pada tempatnya, menggunakan proyeksi yang disediakan untuk kunci. Operator.compare digunakan untuk membandingkan elemen. |
sortInPlaceWith: ('T →' T → int) → 'T [] → unit | Mengurutkan elemen dari sebuah larik dengan menggunakan fungsi perbandingan yang disediakan untuk mengubah larik pada tempatnya. |
sortWith: ('T →' T → int) → 'T [] →' T [] | Mengurutkan elemen array dengan menggunakan fungsi perbandingan yang disediakan, dan mengembalikan array baru. |
sub: 'T [] → int → int →' T [] | Membuat larik yang berisi subrentang yang disediakan, yang ditentukan dengan indeks awal dan panjang. |
jumlah: 'T [] → ^ T | Mengembalikan jumlah elemen dalam larik. |
sumBy: ('T → ^ U) →' T [] → ^ U | Mengembalikan jumlah hasil yang dihasilkan dengan menerapkan fungsi ke setiap elemen larik. |
toList: 'T [] →' T daftar | Mengonversi larik yang disediakan menjadi daftar. |
toSeq: 'T [] → seq <' T> | Melihat larik yang disediakan sebagai urutan. |
tryFind: opsi ('T → bool) →' T [] → 'T | Mengembalikan elemen pertama dalam larik yang disediakan yang dikembalikan fungsi yang disediakan true. KembaliNone jika tidak ada elemen seperti itu. |
tryFindIndex: ('T → bool) →' T [] → opsi int | Mengembalikan indeks elemen pertama dalam larik yang memenuhi kondisi yang disediakan. |
tryPick: (opsi 'T →' U) → 'T [] →' U opsi | Menerapkan fungsi yang disediakan ke elemen berturut-turut dari larik yang disediakan, dan mengembalikan hasil pertama di mana fungsi tersebut mengembalikan Some (x) untuk beberapa x. Jika fungsi tidak pernah mengembalikan Beberapa (x),None dikembalikan. |
buka zip: ('T1 *' T2) [] → 'T1 [] *' T2 [] | Membagi larik pasangan tupel menjadi tupel yang terdiri dari dua larik. |
unzip3: ('T1 *' T2 * 'T3) [] →' T1 [] * 'T2 [] *' T3 [] | Membagi larik tupel tiga elemen menjadi tupel tiga larik. |
zeroCreate: int → 'T [] | Membuat larik yang elemen awalnya disetel ke nilai default Unchecked.defaultof <'T>. |
zip: 'T1 [] →' T2 [] → ('T1 *' T2) [] | Menggabungkan dua larik menjadi larik tupel yang memiliki dua elemen. Kedua larik harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
zip3: 'T1 [] →' T2 [] → 'T3 [] → (' T1 * 'T2 * 113' T3) [] | Menggabungkan tiga larik menjadi larik tupel yang memiliki tiga elemen. Ketiga larik harus memiliki panjang yang sama; jika tidak, ArgumentException akan dimunculkan. |
Pada bagian berikut, kita akan melihat penggunaan dari beberapa fungsi ini.
Membuat Array Menggunakan Fungsi
Modul Array menyediakan beberapa fungsi yang membuat array dari awal.
Itu Array.empty fungsi membuat array kosong baru.
Itu Array.create fungsi membuat larik dengan ukuran tertentu dan menyetel semua elemen ke nilai yang diberikan.
Itu Array.init function membuat sebuah array, diberi dimensi dan fungsi untuk menghasilkan elemen.
Itu Array.zeroCreate fungsi membuat larik di mana semua elemen diinisialisasi ke nilai nol.
Itu Array.copy fungsi membuat array baru yang berisi elemen yang disalin dari array yang sudah ada.
Itu Array.sub function menghasilkan array baru dari subrange array.
Itu Array.append fungsi membuat array baru dengan menggabungkan dua array yang sudah ada.
Itu Array.choose fungsi memilih elemen dari sebuah larik untuk dimasukkan ke dalam larik baru.
Itu Array.collect function menjalankan fungsi tertentu pada setiap elemen array dari array yang ada dan kemudian mengumpulkan elemen yang dihasilkan oleh fungsi dan menggabungkannya menjadi array baru.
Itu Array.concat function mengambil urutan array dan menggabungkannya menjadi satu array.
Itu Array.filter function mengambil fungsi kondisi Boolean dan menghasilkan larik baru yang hanya berisi elemen-elemen dari larik masukan yang kondisinya benar.
Itu Array.rev function menghasilkan array baru dengan membalik urutan array yang sudah ada.
Contoh berikut menunjukkan fungsi-fungsi ini -
Contoh 1
(* using create and set *)
let array1 = Array.create 10 ""
for i in 0 .. array1.Length - 1 do
Array.set array1 i (i.ToString())
for i in 0 .. array1.Length - 1 do
printf "%s " (Array.get array1 i)
printfn " "
(* empty array *)
let array2 = Array.empty
printfn "Length of empty array: %d" array2.Length
let array3 = Array.create 10 7.0
printfn "Float Array: %A" array3
(* using the init and zeroCreate *)
let array4 = Array.init 10 (fun index -> index * index)
printfn "Array of squares: %A" array4
let array5 : float array = Array.zeroCreate 10
let (myZeroArray : float array) = Array.zeroCreate 10
printfn "Float Array: %A" array5
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
0 1 2 3 4 5 6 7 8 9
Length of empty array: 0
Float Array: [|7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0; 7.0|]
Array of squares: [|0; 1; 4; 9; 16; 25; 36; 49; 64; 81|]
Float Array: [|0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0; 0.0|]
Contoh 2
(* creating subarray from element 5 *)
(* containing 15 elements thereon *)
let array1 = [| 0 .. 50 |]
let array2 = Array.sub array1 5 15
printfn "Sub Array:"
printfn "%A" array2
(* appending two arrays *)
let array3 = [| 1; 2; 3; 4|]
let array4 = [| 5 .. 9 |]
printfn "Appended Array:"
let array5 = Array.append array3 array4
printfn "%A" array5
(* using the Choose function *)
let array6 = [| 1 .. 20 |]
let array7 = Array.choose (fun elem -> if elem % 3 = 0 then
Some(float (elem))
else
None) array6
printfn "Array with Chosen elements:"
printfn "%A" array7
(*using the Collect function *)
let array8 = [| 2 .. 5 |]
let array9 = Array.collect (fun elem -> [| 0 .. elem - 1 |]) array8
printfn "Array with collected elements:"
printfn "%A" array9
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
Sub Array:
[|5; 6; 7; 8; 9; 10; 11; 12; 13; 14; 15; 16; 17; 18; 19|]
Appended Array:
[|1; 2; 3; 4; 5; 6; 7; 8; 9|]
Array with Chosen elements:
[|3.0; 6.0; 9.0; 12.0; 15.0; 18.0|]
Array with collected elements:
[|0; 1; 0; 1; 2; 0; 1; 2; 3; 0; 1; 2; 3; 4|]
Mencari Array
Itu Array.find function mengambil fungsi Boolean dan mengembalikan elemen pertama yang fungsinya mengembalikan true, jika tidak memunculkan KeyNotFoundException.
Itu Array.findIndex function bekerja dengan cara yang sama kecuali ia mengembalikan indeks elemen, bukan elemen itu sendiri.
Contoh berikut menunjukkan hal ini.
Microsoft memberikan contoh program yang menarik ini, yang menemukan elemen pertama dalam kisaran angka tertentu yang merupakan kuadrat sempurna dan juga kubus sempurna -
let array1 = [| 2 .. 100 |]
let delta = 1.0e-10
let isPerfectSquare (x:int) =
let y = sqrt (float x)
abs(y - round y) < delta
let isPerfectCube (x:int) =
let y = System.Math.Pow(float x, 1.0/3.0)
abs(y - round y) < delta
let element = Array.find (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
let index = Array.findIndex (fun elem -> isPerfectSquare elem && isPerfectCube elem) array1
printfn "The first element that is both a square and a cube is %d and its index is %d." element index
Ketika Anda mengkompilasi dan menjalankan program, itu menghasilkan output berikut -
The first element that is both a square and a cube is 64 and its index is 62.