F # дальнейшее требование для поиска уникального массива кортежей - PullRequest
2 голосов
/ 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,

Спасибо Абатищеву за его великолепный код, теперь у меня есть такой ответ:

let zip4 a (b : _ []) (c : _ []) (d : _ []) =
    Array.init (Array.length a) (fun i -> a.[i], b.[i], c.[i], d.[i])
let uniqueArray = zip4 dupA1 dupA2 dupA3 dupA4 |> Seq.distinct |> Seq.toArray

Однако, более того, я хочу найти результат каждого массива из уникального массива.

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

Я хочу следующие 4 массива из uniqeArray:

let uniqA1  = [| "A"; "B"; "C"; "D" |]
let uniqA2 = [| 1; 2; 3; 4 |]
let uniqA3 = [| 1.0M; 2.0M; 3.0M; 4.0M |]
let uniqA4 = [| 1L; 2L; 3L; 4L |]

Я попробовал следующий код:

let [| uniqA1, uniqA2, uniqA3, uniqA4 |] = uniqueArray

Сначала я получаю предупреждение компилятора:

Предупреждение 1
Неполный шаблон соответствует этому выражению. Например, значение «[|_; _|]» может указывать на случай, не охватываемый шаблоном (ами).

После того, как я использовал #nowarn "25", во время выполнения я получил следующую ошибку:

Microsoft.FSharp.Core.MatchFailureException was unhandled
Message: An unhandled exception of type 'Microsoft.FSharp.Core.MatchFailureException' occurred in Program.exe

Пожалуйста, помогите мне с дальнейшими требованиями.

1 Ответ

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

Теперь вам нужно unzip4:

let unzip4 arr =
    let a = Array.zeroCreate (Array.length arr)
    let b = Array.zeroCreate (Array.length arr)
    let c = Array.zeroCreate (Array.length arr)
    let d = Array.zeroCreate (Array.length arr)
    arr
    |> Array.iteri (fun i (x, y, z, w) ->
        a.[i] <- x
        b.[i] <- y
        c.[i] <- z
        d.[i] <- w)
    a, b, c, d

Тогда вы можете сделать:

> let uniqA1, uniqA2, uniqA3, uniqA4 = unzip4 uniqueArray;;

val uniqA4 : int64 [] = [|1L; 2L; 3L; 4L|]
val uniqA3 : decimal [] = [|1.0M; 2.0M; 3.0M; 4.0M|]
val uniqA2 : int [] = [|1; 2; 3; 4|]
val uniqA1 : string [] = [|"A"; "B"; "C"; "D"|]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...