f#查找2个obj []列表之间的区别

时间:2016-10-17 12:54:21

标签: arrays list f#

我有2个obj []列表list1和list2。 List1的长度为8,list2的长度为10. list1中的数组只存在于list1中。 list2也是如此。但两者都存在阵列。我想知道如何获取list1中存在的数组。在我运行代码的那一刻,我得到了两个列表中存在的数组列表,但它缺少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)

3 个答案:

答案 0 :(得分:4)

这样的事情:

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]

如果你想直接使用Arrays,还有一堆Array相关函数,比如compareWith,distinct。

但正如之前的答案所指出的那样,这种强制性代码并不是非常惯用的。尽量避免可变变量,尽量避免循环。例如,它可能用Array.map重写。

答案 1 :(得分:2)

首先,我对您的代码进行了微小的更改,并添加了一些printf debuging以查看它是什么。

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

每次发现元素不等于当前元素时,它会添加一个元素。 所以我的尝试是获取list1并且只是ceep或者更好地过滤不属于list2的元素。

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

与s952163不同,如果list1有双重条目,我的结果将有双重条目,不知道是否需要或不需要的beahyuvier。

答案 2 :(得分:2)

如果您希望元素对一个列表唯一,这是在F#4.0中最简单的方法:

list1
|> List.except list2 

将从list1中删除list2的所有元素。请注意,except也会调用不同的内容,因此您可能需要注意这一点。