2011-11-06 69 views
1

我有4個不同數據的數組。對於字符串的第一個數組,我想刪除重複的元素並獲得具有4個元素的唯一元組數組的結果。查找元組的唯一數組

例如,假設數組是:

let dupA1 = [| "A"; "B"; "C"; "D"; "A" |] 

let dupA2 = [| 1; 2; 3; 4; 1 |] 

let dupA3 = [| 1.0M; 2.0M; 3.0M; 4.0M; 1.0M |] 

let dupA4 = [| 1L; 2L; 3L; 4L; 1L |] 

我想要得到的結果是:

let uniqueArray = [| ("A", 1, 1.0M, 1L); ("B", 2, 2.0M, 2L); ("C", 3, 3.0M, 3L); ("D",4, 4.0M, 4L) |] 
+0

所以,你要爲每件商品一起壓縮呢?如果數組包含不同數量的項目會怎樣? – abatishchev

+0

您檢查了(V標記)我的答案。如果你想給拉蒙的答案,你現在可以改變它。 – BLUEPIXY

回答

3
let zip4 s1 s2 s3 s4 = 
    Seq.map2 (fun (a,b)(c,d) ->a,b,c,d) (Seq.zip s1 s2)(Seq.zip s3 s4) 

let uniqueArray = zip4 dupA1 dupA2 dupA3 dupA4 |> Seq.distinct |> Seq.toArray 
4

首先你需要寫一個ZIP4功能,這將壓縮數組:

// the function assumes the 4 arrays are of the same length 
let zip4 a (b : _ []) (c : _ []) (d : _ []) = 
    Array.init (Array.length a) (fun i -> a.[i], b.[i], c.[i], d.[i]) 

然後爲數組使用Seq.distinct

let distinct s = Seq.distinct s |> Array.ofSeq 

其結果將是:

> zip4 dupA1 dupA2 dupA3 dupA4 |> distinct;; 
val it : (string * int * decimal * int64) [] = 
    [|("A", 1, 1.0M, 1L); ("B", 2, 2.0M, 2L); ("C", 3, 3.0M, 3L); 
    ("D", 4, 4.0M, 4L)|] 
+0

非常感謝。實際上,我真正的問題有8個不同數據類型的數組,因爲我不知道如何編寫Zip4這樣的代碼,因爲F#最多隻有zip3;那麼我很難找出如何找到獨特的元組數組。 –