Arrays f#查找两个obj[]列表之间的差异
我有两个obj[]列表list1和list2。列表1的长度为8,列表2的长度为10。列表1中存在仅存在于列表1中的数组。清单2也是如此。但两者都存在数组。我想知道如何获取列表1中存在的数组。在运行代码时,我得到了两个列表中存在的数组列表,但它缺少list1特有的数据。我想知道如何获得唯一的list1数据。有什么建议吗Arrays f#查找两个obj[]列表之间的差异,arrays,list,f#,Arrays,List,F#,我有两个obj[]列表list1和list2。列表1的长度为8,列表2的长度为10。列表1中存在仅存在于列表1中的数组。清单2也是如此。但两者都存在数组。我想知道如何获取列表1中存在的数组。在运行代码时,我得到了两个列表中存在的数组列表,但它缺少list1特有的数据。我想知道如何获得唯一的list1数据。有什么建议吗 let getProdOnly (index:int)(list1:obj[]list)(list2:obj[]list) = let mutable list3 = li
let getProdOnly (index:int)(list1:obj[]list)(list2:obj[]list) =
let mutable list3 = list.Empty
for i = 0 to list1.Length-1 do
for j = 0 to list2.Length-1 do
if list1.Item(i).GetValue(index).Equals(list2.Item(j).GetValue(index)) then
System.Diagnostics.Debug.WriteLine("Exists in List 1 and 2")
else
list3 <- list1.Item(i)
让getProdOnly(索引:int)(列表1:obj[]列表)(列表2:obj[]列表)=
让可变列表3=list.Empty
对于i=0到list1.Length-1 do
对于j=0到list2.Length-1 do
如果list1.Item(i).GetValue(index).Equals(list2.Item(j).GetValue(index)),那么
System.Diagnostics.Debug.WriteLine(“存在于列表1和2中”)
其他的
清单3类似这样的内容:
let ar1 = [|1;2;3|]
let ar2 = [|2;3;4|]
let s1 = ar1 |> Set.ofArray
let s2 = ar2 |> Set.ofArray
Set.difference s1 s2
//val it : Set<int> = set [1]
让ar1=[1;2;3]
设ar2=[2;3;4]
设s1=ar1 |>数组集
设s2=ar2 |>数组集
集差s1 s2
//val it:Set=Set[1]
如果要直接使用数组,还存在一系列与数组相关的函数,如compareWith、distinct
但正如前面的回答所指出的,这种命令式代码不是很地道。尽量避免可变变量,尽量避免循环。例如,它可以用Array.map
重写 首先,我对您的代码做了一些小改动,并添加了一些printf调试,以了解is的功能
let getProdOnly2 (index:int)(list1:obj[] list)(list2:obj[] list) =
let mutable list3 : obj[] list= list.Empty
for i = 0 to list1.Length-1 do
for j = 0 to list2.Length-1 do
if list1.[i].[index] = list2.[j].[index] then
printfn "equal"
System.Diagnostics.Debug.WriteLine("Exists in List 1 and 2")
list3
else
printfn "add %A %A" (list1.Item(i)) (list2.Item(j))
list3 <- list1.Item(i) :: list3
list3
list3
与s952163不同的是,如果列表1有两个条目,我的结果将有两个条目,不知道这是想要的还是不想要的beahyuvier。如果您想要一个列表中唯一的元素,这是在F#4.0中最简单的方法:
这将从列表1中删除列表2的所有元素。请注意,except
也会调用distinct,因此您可能需要注意。可能会重复索引到F#List中!啊,我的眼睛!这假定没有重复的值。如果要保留重复的值,那么幂集或其他东西就是答案。但据我所知,F3中并没有这方面的本地库。@HelgeReneUrholm我同意。这一切都取决于数据和意图。我们当然可以检查每个输入数组并累积结果。
let getProdOnly3 (index:int)(list1:obj[] list)(list2:obj[] list) =
list1
|> List.filter (fun el1 ->
list2
|> List.fold (fun acc el2 -> acc && (el2<>el1)) true )
let list1 = [ [| 1;2;3;4|]
[| 1;2;3;4|]
[| 2;3;4|]
[| 3;4;5|] ] |> List.map (fun a -> a |> Array.map (fun e -> box e))
let list2 = [ [| 2;3;4|]
[| 3;4;5|] ] |> List.map (fun a -> a |> Array.map (fun e -> box e))
list1
|> List.except list2