2016-10-17 6 views
2

私は2つのobj []リストlist1とlist2を持っています。 List1の長さは8、list2の長さは10です.list1にはlist1にのみ存在する配列が存在します。それはlist2でも同じです。しかし、両方に存在する配列があります。私はlist1に存在する配列を取得する方法が不思議です。私のコードを実行する瞬間、両方のリストに存在する配列のリストを取得しますが、list1に固有のデータがありません。私はそのユニークなリスト1のデータを取得する方法が不思議です。助言がありますか?f#2つのobj []リストの違いを見つける

let getProdOnly (index:int)(list1:obj[]list)(list2:obj[]list) = 
    let mutable list3 = list.Empty 
    for i = 0 to list1.Length-1 do 
     for j = 0 to list2.Length-1 do 
      if list1.Item(i).GetValue(index).Equals(list2.Item(j).GetValue(index)) then 
       System.Diagnostics.Debug.WriteLine("Exists in List 1 and 2") 
      else 
       list3 <- list1.Item(i) 
+1

[F#Seq diff]の重複の可能性があります(http://stackoverflow.com/questions/1158114/f-seq-diff) – franssu

+4

F#リストへのインデックス付け!ああ、私の目! –

答えて

5

このような何か:あなたは直接配列で作業する場合

let ar1 = [|1;2;3|] 
let ar2 = [|2;3;4|] 
let s1 = ar1 |> Set.ofArray 
let s2 = ar2 |> Set.ofArray 
Set.difference s1 s2 
//val it : Set<int> = set [1] 

Array関連機能の束もあり、compareWithのように、明確な、存在しています。

しかし、これまでの回答で指摘したように、このタイプの命令コードはそれほど慣用的ではありません。可変変数を避け、ループを避けるようにしてください。おそらく、例えばArray.mapと書き直すことができます。

+1

重複する値がないことを前提としています。重複した値が保存されている場合は、パワーセットまたは何かが答えです。しかし、私の知る限りではF3のそれのためのネイティブライブラリがありません。 –

+0

@HelgeReneUrholm私は同意します。これはすべてデータとインテントに依存します。確かに各入力配列をチェックして結果を累積することができます。 – s952163

2

まず、マイナーチェンジでコードを取り出し、printfデバッグを追加して、何が行われているかを確認しました。

let getProdOnly2 (index:int)(list1:obj[] list)(list2:obj[] list) = 
    let mutable list3 : obj[] list= list.Empty 
    for i = 0 to list1.Length-1 do 
     for j = 0 to list2.Length-1 do 
      if list1.[i].[index] = list2.[j].[index] then 
       printfn "equal" 
       System.Diagnostics.Debug.WriteLine("Exists in List 1 and 2") 
       list3 
      else 
       printfn "add %A %A" (list1.Item(i)) (list2.Item(j)) 
       list3 <- list1.Item(i) :: list3 
       list3 
    list3 

そして、現在の要素と等しくない要素が見つかるたびに要素を追加します。 私はリスト1を取って、リスト2に含まれていない要素をフィルタリングするか、またはそれ以上のフィルタリングをします。

let getProdOnly3 (index:int)(list1:obj[] list)(list2:obj[] list) = 
    list1 
    |> List.filter (fun el1 -> 
     list2 
     |> List.fold (fun acc el2 -> acc && (el2<>el1)) true) 

私はLIST1は、二重のエントリを持っている場合、私の結果はそれを望んでいたか、不要なbeahyuvierであるかどうかを知りませんが、二重のエントリを持つことになりますs952163に次のリストの違いで

let list1 = [ [| 1;2;3;4|] 
       [| 1;2;3;4|] 
       [| 2;3;4|] 
       [| 3;4;5|] ] |> List.map (fun a -> a |> Array.map (fun e -> box e)) 

let list2 = [ [| 2;3;4|] 
       [| 3;4;5|] ] |> List.map (fun a -> a |> Array.map (fun e -> box e)) 

でコードをテストしました。

list1 
|> List.except list2 

リスト1からリスト2のすべての要素を削除します:あなたは1つのリストに固有の要素が必要な場合

2

が、これはF#4.0でそれを行うための最も簡単な方法です。 exceptも別名を呼び出すので、注意する必要があります。

関連する問題