Найти уникальный массив кортежей - PullRequest
1 голос
/ 06 ноября 2011

У меня есть 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) |]

Ответы [ 2 ]

4 голосов
/ 06 ноября 2011

Сначала вам нужно написать функцию 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)|]
3 голосов
/ 06 ноября 2011
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
...