f#在Array2D中交换元素

时间:2014-05-07 18:45:58

标签: arrays f# swap

如果我有一个二维数组,如

test = array2D [|[|1; 2; 3|];
                 [|4; 5; 6|];]

我希望通过索引交换两个元素,例如

swap test (0,0) (1,1) //[|[|5; 2; 3|];
                        //[|4; 1; 6|];]

我该怎么写?我已经看到了通过引用传递每个项目的解决方案并对其进行了修改,但这对我来说似乎是不合时宜的(我可能是错的)。

2 个答案:

答案 0 :(得分:3)

您可以使用不会改变原始数组的Array2D.mapi来编写交换函数。这将返回一个包含交换值的新数组:

let swap (arr : int[,]) i1 i2 =
    let map i j v =
        match (i,j) with
        | t when t = i1 -> arr.[fst i2, snd i2]
        | u when u = i2 -> arr.[fst i1, snd i1]
        | _ -> v
    arr |> Array2D.mapi map

答案 1 :(得分:3)

这是一个简单的就地交换。

module Array2D =
    let swap (x1, y1) (x2, y2) (array: _[,]) =
        let temp = array.[x1, y1]
        array.[x1, y1] <- array.[x2, y2]
        array.[x2, y2] <- temp
        array

如果您需要副本,只需拨打Array2D.copy

即可
array2D [|[|1; 2; 3|];[|4; 5; 6|]|]
|> Array2D.copy
|> Array2D.swap (0,0) (1,1) 
|> printfn "%A"