在二维数组中交换元素的 F# 代码

4
如果我有一个二维数组,比如说:
test = array2D [|[|1; 2; 3|];
                 [|4; 5; 6|];]

我希望你能够按照索引交换两个元素,例如:
swap test (0,0) (1,1) //[|[|5; 2; 3|];
                        //[|4; 1; 6|];]

我该怎么写呢?我看到一些解决方案是通过引用传递每个项并改变它,但这对我来说似乎不太文雅(可能我错了)。

2个回答

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

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"

1
这可能比被接受的回复中建议的模式匹配解决方案要快得多。 - Asik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接