Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/arrays/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Arrays f#交换Array2D中的元素_Arrays_F#_Swap - Fatal编程技术网

Arrays f#交换Array2D中的元素

Arrays f#交换Array2D中的元素,arrays,f#,swap,Arrays,F#,Swap,如果我有一个2D数组,比如 test = array2D [|[|1; 2; 3|]; [|4; 5; 6|];] 我想通过索引交换两个元素,例如 swap test (0,0) (1,1) //[|[|5; 2; 3|]; //[|4; 1; 6|];] 我该怎么写呢?我见过通过引用传递每个项并对其进行变异的解决方案,但这对我来说似乎不太合适(我可能错了)。您可以使用它编写交换函数,而不会变异原始数组。这将返

如果我有一个2D数组,比如

test = array2D [|[|1; 2; 3|];
                 [|4; 5; 6|];]
我想通过索引交换两个元素,例如

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

我该怎么写呢?我见过通过引用传递每个项并对其进行变异的解决方案,但这对我来说似乎不太合适(我可能错了)。

您可以使用它编写交换函数,而不会变异原始数组。这将返回一个带有交换值的新数组:

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

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

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 [|[|1; 2; 3|];[|4; 5; 6|]|]
|> Array2D.copy
|> Array2D.swap (0,0) (1,1) 
|> printfn "%A"