F#數(shù)組

2018-12-15 17:09 更新

數(shù)組是固定大小的,基于零的,可變的所有相同類型的連續(xù)數(shù)據(jù)元素的集合。

創(chuàng)建數(shù)組

可以創(chuàng)建使用各種語法和方法陣列或通過使用從陣列模塊的功能。在本節(jié)中,我們將討論在不使用模塊的功能創(chuàng)建數(shù)組。

有三種語法方法來創(chuàng)建沒有函數(shù)的數(shù)組 

1、通過列出[| 和|],并用分號分隔。
2、通過將每個元素放在單獨的行上,在這種情況下,分號分隔符是可選的。
3、通過使用序列表達(dá)式。
您可以使用點運算符(。)和方括號([and])訪問數(shù)組元素。
以下示例演示創(chuàng)建數(shù)組 

//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" "

當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出 

1 2 3 4 5 6
1 2 3 4 5
1 4 9 16 25 36 49 64 81 100

對數(shù)組基本操作

庫模塊Microsoft.FSharp.Collections.Array支持對一維數(shù)組的操作。
下表顯示了數(shù)組的基本操作 

描述
append : 'T [] → 'T [] → 'T []創(chuàng)建包含后跟另一個陣列的元件中的一個數(shù)組的元素的數(shù)組。
average : ^T [] → ^T返回的數(shù)組的元素的平均值。
averageBy : ('T → ^U) → 'T [] → ^U返回通過施加一個函數(shù)的陣列的每個元件產(chǎn)生的元素的平均。
blit : 'T [] → int → 'T [] → int → int → unit讀取范圍從一個數(shù)組中的元素,并將其寫入到另一個。
choose : ('T → U option) → 'T [] → 'U []一個應(yīng)用提供的函數(shù)對數(shù)組中的每個元素。返回包含每個元素的結(jié)果x上的數(shù)組,該函數(shù)返回一些(X)。
collect : ('T → 'U []) → T [] → 'U []應(yīng)用提供的函數(shù),一個陣列的每個元素,并置的結(jié)果,并返回合并數(shù)組。
concat : seq<'T []> → 'T []創(chuàng)建一個包含每個陣列提供的序列中的元素的數(shù)組。
copy : 'T → 'T []創(chuàng)建一個包含所提供數(shù)組的元素的數(shù)組。
create : int → 'T → 'T []創(chuàng)建一個數(shù)組,其元素都是最初所提供的值。
empty : 'T []返回給定類型的空數(shù)組。
exists : ('T → bool) → 'T [] → bool測試數(shù)組中的任何元素是否滿足所提供的謂語。
exists2 : ('T1 → 'T2 → bool) → 'T1 [] → 'T2 [] → bool測試是否有對兩個數(shù)組的相應(yīng)元素的滿足提供的條件。
fill : 'T [] → int → int → 'T → unit填補了一系列與所提供的數(shù)值數(shù)組的元素。
filter : ('T → bool) → 'T [] → 'T []返回只包含所提供的數(shù)組,所提供的條件返回true的元素的集合。
find : ('T → bool) → 'T [] → 'T返回為其提供的函數(shù)返回true的第一個元素。引發(fā)KeyNotFoundException如果沒有這樣的元素存在。
findIndex : ('T → bool) → 'T [] → int返回滿足提供的條件數(shù)組的第一個元素的索引。引發(fā)KeyNotFoundException如果沒有一個元素的滿足該條件。
fold : ('State → 'T → 'State) → 'State → 'T [] → 'State
將函數(shù)應(yīng)用于數(shù)組中的每個元素,穿線通過計算累加器的說法。如果輸入函數(shù)為f,所述陣列元件是I0 ...中,此函數(shù)計算F(...(FS I0)...)中。
fold2 : ('State → 'T1 → 'T2 → 'State) → 'State → 'T1 [] → 'T2 [] → 'State適用于對從兩個提供的數(shù)組中的元素,左到右,穿線通過計算累加器參數(shù)的函數(shù)。兩個輸入數(shù)組必須具有相同的長度;否則,ArgumentException的上升。
foldBack : ('T → 'State → 'State) → 'T [] → 'State → 'State將函數(shù)應(yīng)用于數(shù)組中的每個元素,穿線通過計算累加器的說法。如果輸入函數(shù)為f,所述陣列元件是I0 ...中,此函數(shù)計算?FI0(...(F s中))。
foldBack2 : ('T1 → 'T2 → 'State → 'State) → 'T1 [] → 'T2 [] → 'State → 'State將函數(shù)應(yīng)用于對從兩個提供的數(shù)組中的元素,從右到左,穿線通過計算累加器的說法。兩個輸入數(shù)組必須具有相同的長度;否則,ArgumentException的上升。
forall : ('T → bool) → 'T [] → bool測試數(shù)組中的所有元素是否滿足提供的條件。
forall2 : ('T1 → 'T2 → bool) → 'T1 [] → 'T2 [] → bool測試是否提供的兩個陣列的所有相應(yīng)的元素滿足提供的條件。
get : 'T [] → int → 'T會從數(shù)組中的元素。
init : int → (int → 'T) → 'T []使用提供的函數(shù)來創(chuàng)建提供維數(shù)組。
isEmpty : 'T [] → bool測試一個數(shù)組是否有任何元素。
iter : ('T → unit) → 'T [] → unit應(yīng)用提供的函數(shù),一個數(shù)組中的每個元素。
iter2 : ('T1 → 'T2 → unit) → 'T1 [] → 'T2 [] → unit)應(yīng)用提供的函數(shù),一對從兩個數(shù)組索引匹配的元素。兩個陣列必須具有相同的長度;否則,ArgumentException的上升。
iteri : (int → 'T → unit) → 'T [] → unit應(yīng)用提供的函數(shù),一個數(shù)組中的每個元素。傳遞給函數(shù)的整數(shù)表示該元素的索引。
iteri2 : (int → 'T1 → 'T2 → unit) → 'T1 [] → 'T2 [] → unit應(yīng)用提供的函數(shù),一對從兩個陣列的匹配的索引,也傳遞元件的索引元素。兩個陣列必須具有相同的長度;否則,一個ArgumentException升高。
length : 'T [] → int返回的數(shù)組的長度。 Length屬性做同樣的事情。
map : ('T → 'U) → 'T [] → 'U []創(chuàng)建一個數(shù)組,其元素施加提供的函數(shù),每一個提供的數(shù)組的元素的結(jié)果。
map2 : ('T1 → 'T2 → 'U) → 'T1 [] → 'T2 [] → 'U []創(chuàng)建一個數(shù)組,其元素是應(yīng)用提供的函數(shù),提供的兩個數(shù)組的相應(yīng)元素的結(jié)果。兩個輸入數(shù)組必須具有相同的長度;否則,ArgumentException的上升。
mapi : (int → 'T → 'U) → 'T [] → 'U []創(chuàng)建一個數(shù)組,其元素施加提供的函數(shù),每一個提供的數(shù)組的元素的結(jié)果。傳遞給函數(shù)的整數(shù)索引指示正在轉(zhuǎn)變的元素的索引。
mapi2 : (int → 'T1 → 'T2 → 'U) → 'T1 [] → 'T2 [] → 'U []創(chuàng)建一個數(shù)組,其元素施加提供的函數(shù),所述兩個集合成對的相應(yīng)的元件,也傳遞元件的索引的結(jié)果。兩個輸入數(shù)組必須具有相同的長度;否則,ArgumentException的上升。
max : 'T [] → 'T返回最大的數(shù)組中的所有元素。 Operators.max用于元素進(jìn)行比較。
maxBy : ('T → 'U) → 'T [] → 'T返回最大的數(shù)組的所有元素,通過Operators.max上的功能結(jié)果相比較。
min : ('T [] → 'T返回最小的一個數(shù)組的所有元素。 Operators.min用于元素進(jìn)行比較。
minBy:('T→'U)→“T []→'T返回最小的一個數(shù)組的所有元素。 Operators.min用于元素進(jìn)行比較。
ofList : 'T list → 'T []創(chuàng)建一個從所提供的列表中的數(shù)組。
ofSeq : seq<'T> → 'T []創(chuàng)建一個從所提供的枚舉對象的數(shù)組。
partition : ('T → bool) → 'T [] → 'T [] * 'T []分割的陣列分成兩個陣列,一個包含的量,提供的條件返回true的元素,和其他含有這些對于其返回false。
permute : (int → int) → 'T [] → 'T []根據(jù)指定的置換Permutes數(shù)組的元素。
pick : ('T → 'U option) → 'T [] → 'U應(yīng)用提供的函數(shù),所提供的數(shù)組的連續(xù)元素,返回的第一個結(jié)果所在的函數(shù)返回一些(十)有些X的。如果函數(shù)永遠(yuǎn)不會返回部分(X),KeyNotFoundException升高。
reduce : ('T → 'T → 'T) → 'T [] → 'T將函數(shù)應(yīng)用于數(shù)組中的每個元素,穿線通過計算累加器的說法。如果輸入函數(shù)為f,所述陣列元件是I0 ...中,此函數(shù)計算F(...(六I0的i1)...)中。如果數(shù)組的大小為零,ArgumentException的升高。
reduceBack:('T→'T→'T)→“T []→'T將函數(shù)應(yīng)用于數(shù)組中的每個元素,穿線通過計算累加器的說法。如果輸入函數(shù)是f和元素I0 ...中,此函數(shù)計算?FI0(...(F IN-1))。如果數(shù)組的大小為零,ArgumentException的升高。
rev : 'T [] → 'T []反轉(zhuǎn)在供給數(shù)組中的元素的順序。
scan : ('State → 'T → 'State) → 'State → 'T [] → 'State [])行為就像折,但是中間結(jié)果與最終結(jié)果一起返回。
scanBack : ('T → 'State → 'State) → 'T [] → 'State → 'State []行為就像折返,但中介結(jié)果與最終結(jié)果一起返回。
set : 'T [] → int → 'T → unit設(shè)置一個數(shù)組中的一個元素。
sort : 'T[] → 'T []排序的數(shù)組中的元素,并返回一個新的數(shù)組。 Operators.compare用于元素進(jìn)行比較。
sortBy : ('T → 'Key) → 'T [] → 'T []使用附帶的功能改造元素上排序操作所基于的類型排序的數(shù)組的元素,并返回一個新的數(shù)組。 Operators.compare用于元素進(jìn)行比較。
sortInPlace : 'T [] → unit通過改變到位陣列,使用提供的比較函數(shù)排序數(shù)組的元素。 Operators.compare用于元素進(jìn)行比較。
sortInPlaceBy : ('T → 'Key) → 'T [] → unit通過改變到位陣列,使用為鍵所提供的投影排序數(shù)組的元素。 Operators.compare用于元素進(jìn)行比較。
sortInPlaceWith : ('T → 'T → int) → 'T [] → unit使用附帶的比較功能改變的地方數(shù)組排序數(shù)組的元素。
sortWith : ('T → 'T → int) → 'T [] → 'T []使用附帶的比較函數(shù)排序數(shù)組的元素,并返回一個新的數(shù)組。
sub : 'T [] → int → int → 'T []創(chuàng)建包含所提供的子范圍,它是由開始索引和長度指定的數(shù)組。
sum : 'T [] → ^T返回數(shù)組中的元素的總和。
sumBy : ('T → ^U) → 'T [] → ^U返回通過施加一個函數(shù)的陣列的每個元件產(chǎn)生的結(jié)果的總和。
toList : 'T [] → 'T list所提供的數(shù)組列表轉(zhuǎn)換。
toSeq : 'T [] → seq<'T>享有提供的數(shù)組作為序列。
tryFind : ('T → bool) → 'T [] → 'T option返回提供的數(shù)組為其提供的函數(shù)返回true的第一個元素。如果沒有這樣的元素存在,則返回 。
tryFindIndex : ('T → bool) → 'T [] → int option返回滿足提供的條件數(shù)組的第一個元素的索引。
tryPick : ('T → 'U option) → 'T [] → 'U option應(yīng)用提供的函數(shù),所提供的陣列的相繼的元素,并返回第一個結(jié)果,其中函數(shù)返回部分(x)的一些X]。如果函數(shù)永遠(yuǎn)不會返回部分(X),返回None。
unzip : ('T1 * 'T2) [] → 'T1 [] * 'T2 []拆分元組對的數(shù)組分成兩個數(shù)組的元組。
unzip3:('T1 *'T2 *'T3)[]→“T1 [] *'T2 [] *'T3 []分裂三種元素的元組的陣列成三個陣列中的元組。
zeroCreate:INT→'T []創(chuàng)建一個數(shù)組,其元素最初設(shè)置為Unchecked.defaultof <'T>的默認(rèn)值。
zip : 'T1 [] → 'T2 [] → ('T1 * 'T2) []結(jié)合兩個陣列成具有兩個元素的元組的陣列。兩個數(shù)組必須有相等的長度;否則,ArgumentException的上升。
zip3:“T1 []→'T2 []→”T3 []→('T1 *'T2 * 113'T3)[]結(jié)合三個數(shù)組成有三個元素的元組的數(shù)組。三個數(shù)組必須有相等的長度;否則,ArgumentException的上升。

在以下部分中,我們將看到的一些這些功能的用途。

創(chuàng)建陣列使用函數(shù)

陣列模塊提供了從頭開始創(chuàng)建一個數(shù)組多種功能。

  • Array.empty函數(shù)創(chuàng)建一個新的空數(shù)組。

  • Array.create函數(shù)創(chuàng)建一個指定大小的數(shù)組,并將所有元素給定的值。

  • 所述Array.init函數(shù)給出的尺寸和產(chǎn)生的元素的函數(shù)創(chuàng)建一個數(shù)組。

  • 所述Array.zeroCreate函數(shù)創(chuàng)建在其中所有元素初始化為零值的數(shù)組。

  • Array.copy函數(shù)創(chuàng)建一個包含從現(xiàn)有陣列復(fù)制元素的數(shù)組。

  • Array.sub函數(shù)生成從陣列中的一個子范圍的新數(shù)組。

  • Array.append函數(shù)創(chuàng)建通過合并兩個現(xiàn)有陣列的新數(shù)組。

  • Array.choose功能選擇一個數(shù)組元素在新數(shù)組中包含。

  • Array.collect功能運行的現(xiàn)有陣列的每個數(shù)組元素的指定函數(shù),然后收集該函數(shù)生成的元素,并將它們組合成一個新的數(shù)組。

  • Array.concat函數(shù)接受陣列的序列,并將它們組合成一個陣列。

  • Array.filter函數(shù)接受一個布爾條件的功能,并只包含從輸入數(shù)組,它的條件是真的這些元素的數(shù)組。

  • Array.rev函數(shù)通過顛倒現(xiàn)有數(shù)組的順序的新數(shù)組。

下面的例子演示這些功能 

例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

當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出 

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|]

例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

當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出 

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|]

搜索數(shù)組

Array.find函數(shù)接受一個布爾函數(shù),并返回該函數(shù)返回true的第一個元素,否則會引發(fā)KeyNotFoundException。

所述Array.findIndex功能工作,除了它返回元素的索引,而不是元素本身類似。

下面的例子說明了這一點。

Microsoft提供這個有趣的程序例子,它找到的第一個元件在給定的數(shù),它是兩個完全平方以及完美立方體的范圍 

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

當(dāng)你編譯和執(zhí)行程序,它產(chǎn)生以下輸出 

The first element that is both a square and a cube is 64 and its index is 62.
以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號