我有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)
答案 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
也会调用不同的内容,因此您可能需要注意这一点。