Arrays F中的数组内比较#
假设我想在F#中进行一些数组内比较,例如,确定给定的整数数组Arrays F中的数组内比较#,arrays,f#,comparison,Arrays,F#,Comparison,假设我想在F#中进行一些数组内比较,例如,确定给定的整数数组arr是否包含严格递增顺序的整数。我会这样做: let arri = arr |> Array.mapi (fun i e -> i, e) let isArrStrictlyIncreasing = arri |> Array.tryFind (fun e -> if fst e = arri.Length - 1 then fal
arr
是否包含严格递增顺序的整数。我会这样做:
let arri =
arr
|> Array.mapi (fun i e -> i, e)
let isArrStrictlyIncreasing =
arri
|> Array.tryFind (fun e ->
if fst e = arri.Length - 1 then
false
else
snd e >= snd arri.[1 + fst e])
|> Option.isNone
但是,我想知道是否有一种更简洁、更实用的方法来进行数组内比较,而不必使用array.mapi
和if else
?一种简单的方法:
let isincr arr =
arr
|> Array.fold (fun (a,b) (c) -> ((b<c && a)),c) (true,System.Int32.MinValue)
|> fst
让isincr arr=
啊
|>数组.fold(fun(a,b)(c)->(b fst
您不能只执行以下操作吗
let expected = [| candidate.[0] .. candidate.[0] + candidate.Length - 1 |]
candidate = expected
这只是构建您期望的数组,并使用F#的结构相等性来比较这两个数组
一个更普遍的选择可能是:
let isOrdered arr = arr |> Array.sort = arr
let hasDistinctMembers (arr : 'a array) =
let distinct = arr |> Seq.distinct |> Seq.toArray
distinct.Length = arr.Length
let isStrictlyIncreasing arr = arr |> isOrdered && arr |> hasDistinctMembers
用法:
> isStrictlyIncreasing [| 7; 11; 8 |];;
val it : bool = false
> isStrictlyIncreasing [| 7..33 |];;
val it : bool = true
> isStrictlyIncreasing [| 7; 8; 11 |];;
val it : bool = true
> isStrictlyIncreasing [| 7; 7; 8; 11 |];;
val it : bool = false
我的FSI为
系统.Int32.MinValue
抛出了一个“此表达式应具有bool类型,但此处具有int类型”。抱歉,忘记了保持累加器-修复。我认为如果输入中存在间隙(即[|1;4 |]
)可能会失败。啊,您不想要严格单调递增的序列:)