2011-11-06 5 views
2

4 개의 다른 데이터 배열이 있습니다. 문자열의 첫 번째 배열에 대해 중복 요소를 삭제하고 4 개의 요소가있는 고유 한 튜플의 배열 결과를 가져와야합니다.F # 튜플의 고유 배열을 찾는 추가 요구 사항

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 
: 그의 위대한 코드 abatishchev하는

let uniqueArray = [| ("A", 1, 1.0M, 1L); ("B", 2, 2.0M, 2L); ("C", 3, 3.0M, 3L); ("D",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) |] 

나는 uniqeArray에서 다음 4 개 배열을 원하는 :

Warning 1
Incomplete pattern matches on this expression. For example, the value ' [|_; _|] ' may indicate a case not covered by the pattern(s).

:

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

, 나는 컴파일러 경고를 먼저 얻을 :

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 |] 

나는 다음 코드를 시도

를 사용한 후

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

가 더 요구 사항을 제발 도와주세요 :는 실행 시간 동안, 나는 다음과 같은 오류가 발생했습니다.

+0

, 당신은 올바른으로 답변을 표시해야합니다. –

+2

abatishchev가 해당 코드를 작성하지 않았습니다. 코드를 작성한 사람은 @Ramon Snir입니다. 누구에게 도움을 주 었는지 크레딧을주십시오. – pad

+0

안녕하세요, 당신의 피드백을 위해 당신보다, 나는 틀린 신용을 위해 실수 할 수 있습니다, 나는 나중에 그것을 바꿀 것입니다; 그러나 나는 그 질문을 답으로 표시 할 수있는 방법을 볼 수 없다. 몇 가지 지시 사항을 알려주십시오. 다시 도움 주셔서 감사합니다. –

답변

3

는 이제 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"|] 
+0

안녕하세요, 훌륭한 코드를 제공해 주셔서 감사 드리며 잘 작동합니다. 그러나 나는 여전히 답을 올바른 것으로 표시하는 방법을 모른다. 내가 알면 나는 그것을하고 당신의 일에 공로를 기울일 것이다. 적시에 도와 주셔서 다시 한 번 감사드립니다! John –

+0

게시물의 왼쪽에는 위쪽/아래쪽 화살표가 있고 그 아래에는 윤곽선이 지정된 v 단추가 있습니다. 대답을 수락하려면 버튼을 클릭하십시오 (그리고 대답이 좋았다고 말하고 싶다면 위쪽 화살표를 누르십시오). –