2011-10-26 124 views
0
#light 

let a1 = [| (1, 1); (2, 1); (3, 1) |] 

let a2 = [| (1, 1); (2, 3); (3, 1) |] 

let aa = Array.zip a1 a2 
     |> Array.filter(fun (x, y) -> x <> y) 

我想寫一個函數來做到這一點:它會從兩個數組中返回不同的元組,但我也想返回不同元組的索引在第二個數組中和第二個數組中的對應元組中。 (!我的代碼沒有完全工作尚未) 對於我上面的例子中,我想回到:1和(2,3) 又如:F#比較元組的數組並返回不同的元素和索引

let a1 = [| (1, 1); (2, 1); (3, 1); (4, 1) |] 

let a2 = [| (1, 1); (2, 3); (3, 1); (4, 2) |] 

我想回到:1,(2,3 ); 3和(4,2) 如果您有任何想法,請告訴我你的代碼。 此外,我不習慣F#的新地方,這種格式讓我覺得很難找到一個發佈我的問題的好地方,因此,我仍然在這裏發佈我的問題。

回答

4
let a1 = [| (1, 1); (2, 1); (3, 1) |] 

let a2 = [| (1, 1); (2, 3); (3, 1) |] 

let diff = 
    (a1, a2) 
    ||> Array.mapi2(fun i t1 t2 -> (i, t1, t2)) 
    |> Array.choose(fun (i, a, b) -> if a <> b then Some (i, b) else None) 
+0

嗨,德斯科: 非常感謝你,你的代碼工作。然而,由於我對F#不是很有經驗,對我而言,很難理解||> 現在,我更瞭解它。 再次感謝您的善意和快速幫助! –

0

這裏有一個辦法做到這一點:

let diff a b = 
    let s = Set.ofSeq a 
    b 
    |> Seq.mapi (fun i x -> i, x) 
    |> Seq.filter (fun (_, x) -> not (Set.contains x s)) 

let a1 = [| (1, 1); (2, 1); (3, 1) |] 
let a2 = [| (1, 1); (2, 3); (3, 1) |] 
diff a1 a2 //output: seq [(1, (2, 3))] 

這適用於任何集合(listarrayseq<_>set等)和順序可以不同的長度。如果你知道你總是使用相同長度的數組,你可以相應地進行優化(參見desco的答案)。

0
let diff (a:(int * int)[]) b = 
    b 
    |> Array.mapi (fun i tp -> if a.[i] <> tp then (i, tp) else (-1, tp)) 
    |> Array.filter (fun (x, _) -> x >= 0) 

DEMO

> diff a1 a2;; 
val it : (int * (int * int)) [] = [|1, (2, 3)); (3, (4, 2))|]