在 FSharp 中找出两个数组之间的差异
Finding the difference between two arrays in FSharp
我有两个数组,我想在其中找到第二个数组中不在第一个数组中的元素。
我写了下面的代码:
let array0 = [|"A";"B";"C"|]
let array1 = [|"B";"D";"E"|]
let inZero letter =
array0 |> Array.tryFind(fun l -> if l = letter then true else false)
array1|> Array.filter(fun l -> inZero(l).IsSome)
但我想知道是否有更适合 FSharp 的东西。
提前致谢
如果您不关心重复项,那么您可以使用 F# sets 编写:
// Elements that are in array1, but not in array0
set array1 - set array0
// Elements that are in both arrays (which is what your sample returns)
Set.intersect (set array1) (set array0)
在这两种情况下,您都会得到一个新的 set<int>
,它也是一个 seq<int>
,因此您可以对其进行迭代或使用 Array.ofSeq
将其变回数组。
如果你想保留重复项(如果 array1
中有重复项,那么多次 return 元素),那么我认为你拥有的是好的。如果您想将 多个 数组与一个数组进行比较,那么将 array0
转换为字典以提高查找效率是有意义的:
let inZero =
let set0 = set array0
set0.Contains
// Elements from array1 that are also in array0 (returns multiple
// copies of the same element if it appears repeatedly in array1)
array1 |> Array.filter inZero
转换为 set 会产生一些开销,但会减少查找时间。因此,根据您如何使用它以及数组的大小,这将具有不同的性能特征。但是代码看起来更好,所以这将是我的默认选择。
我有两个数组,我想在其中找到第二个数组中不在第一个数组中的元素。
我写了下面的代码:
let array0 = [|"A";"B";"C"|]
let array1 = [|"B";"D";"E"|]
let inZero letter =
array0 |> Array.tryFind(fun l -> if l = letter then true else false)
array1|> Array.filter(fun l -> inZero(l).IsSome)
但我想知道是否有更适合 FSharp 的东西。
提前致谢
如果您不关心重复项,那么您可以使用 F# sets 编写:
// Elements that are in array1, but not in array0
set array1 - set array0
// Elements that are in both arrays (which is what your sample returns)
Set.intersect (set array1) (set array0)
在这两种情况下,您都会得到一个新的 set<int>
,它也是一个 seq<int>
,因此您可以对其进行迭代或使用 Array.ofSeq
将其变回数组。
如果你想保留重复项(如果 array1
中有重复项,那么多次 return 元素),那么我认为你拥有的是好的。如果您想将 多个 数组与一个数组进行比较,那么将 array0
转换为字典以提高查找效率是有意义的:
let inZero =
let set0 = set array0
set0.Contains
// Elements from array1 that are also in array0 (returns multiple
// copies of the same element if it appears repeatedly in array1)
array1 |> Array.filter inZero
转换为 set 会产生一些开销,但会减少查找时间。因此,根据您如何使用它以及数组的大小,这将具有不同的性能特征。但是代码看起来更好,所以这将是我的默认选择。