Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/list/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays f#查找两个obj[]列表之间的差异_Arrays_List_F# - Fatal编程技术网

Arrays f#查找两个obj[]列表之间的差异

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

我有两个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 = 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