F # сравнивает массивы кортежей и возвращает разные элементы и индекс - PullRequest
0 голосов
/ 26 октября 2011
#light

let a1 = [| (1, 1); (2, 1); (3, 1) |]

let a2 = [| (1, 1); (2, 3); (3, 1) |]

let aa = Array.zip a1 a2
       |> Array.filter(fun (x, y) -> x <> y)

Я хочу написать функцию для этого: она будет возвращать разные кортежи из двух массивов, но я также хочу вернуть индекс другого кортежа во втором массиве и соответствующий кортеж во втором массиве,(Мой код еще не работал полностью!) Для моего приведенного выше примера я хочу вернуть: 1 и (2, 3) Другой пример:

let a1 = [| (1, 1); (2, 1); (3, 1); (4, 1) |]

let a2 = [| (1, 1); (2, 3); (3, 1); (4, 2) |]

Я хочу вернуть: 1 и (2, 3));3 и (4, 2) Если у вас есть идеи, пожалуйста, покажите мне свой код.Кроме того, я не привык к новому месту для F #, формат затрудняет мне поиск подходящего места для размещения моих вопросов, поэтому я все еще публикую свой вопрос здесь.

Ответы [ 3 ]

4 голосов
/ 26 октября 2011
let a1 = [| (1, 1); (2, 1); (3, 1) |]

let a2 = [| (1, 1); (2, 3); (3, 1) |]

let diff = 
    (a1, a2) 
    ||> Array.mapi2(fun i t1 t2 -> (i, t1, t2))
    |> Array.choose(fun (i, a, b) -> if a <> b then Some (i, b) else None)
0 голосов
/ 26 октября 2011
let diff (a:(int * int)[]) b =
  b
  |> Array.mapi (fun i tp -> if a.[i] <> tp then (i, tp) else (-1, tp))
  |> Array.filter (fun (x, _) -> x >= 0) 

ДЕМО

 > diff a1 a2;;
val it : (int * (int * int)) [] = [|1, (2, 3)); (3, (4, 2))|]
0 голосов
/ 26 октября 2011

Вот один из способов сделать это:

let diff a b =
  let s = Set.ofSeq a
  b 
  |> Seq.mapi (fun i x -> i, x)
  |> Seq.filter (fun (_, x) -> not (Set.contains x s))

Пример

let a1 = [| (1, 1); (2, 1); (3, 1) |]
let a2 = [| (1, 1); (2, 3); (3, 1) |]
diff a1 a2 //output: seq [(1, (2, 3))]

Это работает для любой коллекции (list, array, seq<_>, set и т. Д.), И последовательности могут быть различной длины. Если вы знаете, что вы всегда будете использовать массивы одинаковой длины, вы можете оптимизировать их соответствующим образом (см. Ответ desco).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...