繁体   English   中英

使用for循环将元素添加到F#中的Map中

[英]Adding elements to a Map in F# using a for loop

码:

let studentMap =
    for i = 0 to count do
        Map.empty.Add(students.[i].getId(), students.[i].getScores())

我正在尝试按顺序添加到地图。 我有一个数组中的学生对象,并试图按顺序添加它们。 我对如何做到这一点感到困惑。 我以为您可能制作了一个空的映射,然后通过for循环按顺序将其添加到它,但是它总是会引起麻烦并且无法正常工作。 有没有一种使用for循环将项目添加到地图的方法? <key/value>对是这样的: <string, int array> 那是我想要格式化的方式,但它总是给我带来麻烦。 我将再次重申该目标以阐明这一点:我希望能够使用for循环将项添加到地图中,并将我的学生对象数组用于在其中获取所需的适当数据。 我将能够给它一个字符串,并获得例如该学生的成绩。 我知道这是我正在解决的怪异问题,但是我首先需要尝试一些简单的事情。

您可以尝试一种更实用的惯用方法:

假设您有一个类型为Student的数组(在下面的示例中为空数组):

let students = Array.empty<Student>

您可以将数组转换为Map

let mapStudents = students 
                    |> Array.map (fun s -> (s.getId(), s.getScore()))
                    |> Map.ofArray

我认为Map.ofArray方法可能是最好的,但值得指出的是for循环可以做得更好:

let map = new System.Collections.Generic.Dictionary<int, Scores>()
for student in students do
   map.Add(student.getId(), student.getScore())

这样可以避免犯数组界限错误。

您可以使用可变的map变量:

let studentMap = 
    let mutable m <- Map.empty  
    for i = 0 to count do  
        m <- m.Add(students.[i].getId(), students.[i].getScores())
    m

或可变的字典:

let studentMap = 
    let m = new System.Collections.Generic.Dictionary<int, Scores>()  
    for i = 0 to count do  
        m.Add(students.[i].getId(), students.[i].getScores())
    m

一个更实用的解决方案是使用折叠:

let studentMap = seq { 0 .. count } |> Seq.fold (fun (m: Map<int, Scores>) i -> m.Add(students.[i].getId(), students.[i].getScores())) Map.empty

在功能语言中,内置数据结构是不可变的 ,也就是说,当您添加元素时,将返回该数据结构的新值。

如果要将一种结构转换为另一种结构,通常可以使用诸如Map.ofArray类的Map.ofArray函数Map.ofArray 如果您遇到更复杂的情况(例如生成值的函数),则可以使用'loop' ,并且循环的每次迭代都将返回数据结构的新值。 以函数方式表达这种“循环”的方法是使用递归函数

let studentMap =
    let rec loop currentMap i =
        if i >= count then currentMap
        else
            let newMap = Map.add (students.[i].getId()) (students.[i].getScores()) currentMap
            loop newMap (i+1)
    loop Map.empty 0

现在,您可以完全灵活地生成值(它们不必成为数组的一部分),并且可以避免在函数式编程中不惯用的可变变量 理想情况下,像在这种情况下一样,该函数应该是尾部递归的,以允许尾部调用优化(并避免大输入的堆栈溢出)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM