【问题标题】:SML - Find same elements in a stringSML - 在字符串中查找相同的元素
【发布时间】:2015-08-22 23:08:38
【问题描述】:

对不起,我再次需要你的帮助! 我需要一个将

作为输入的函数
list of (string*string) 

并作为输出a返回

list of (int*int)

该函数应该对列表进行操作,使得由相同字符串表示的每个元素都必须替换为相同的数字。 例如,如果我插入:

changState([("s0","l0"),("l0","s1"),("s1","l1"),("l1","s0")]);

输出应该是: val it = [(0,1),(1,2),(2,3),(3,0)]

有人有解决这个问题的想法吗? 我真的很感激。非常感谢!

【问题讨论】:

    标签: string list sml


    【解决方案1】:

    这是一种方法:

    structure StringKey = 
    struct 
      type ord_key = string 
      val compare = String.compare
    end
    
    structure Map = RedBlackMapFn(StringKey)
    
    fun changState l =
      let fun lp(l, map, max) = 
            case l 
               of nil => nil
                | (s1,s2)::l' => 
                    case (Map.find(map, s1), Map.find(map, s2))
                       of (SOME i1, SOME i2) => (i1, i2)::lp(l', map, max)
                        | (NONE, SOME i) => (max, i)::lp(l', Map.insert(map, s1, max), max+1)
                        | (SOME i, NONE) => (i, max)::lp(l', Map.insert(map, s2, max), max+1)
                        | (NONE, NONE) =>
                            if s1 <> s2
                            then (max, max+1)::lp(l', Map.insert(Map.insert(map, s1, max), s2, max+1), max+2)
                            else (max, max)::lp(l', Map.insert(map, s1, max), max+1)
      in lp(l, Map.empty, 0) end
    

    这里lp 获取字符串对列表、一个将字符串与整数关联的映射以及一个变量max,它跟踪下一个未使用的数字。在每次迭代中,我们在映射中查找两个字符串。如果找到它们,则返回该整数,否则,使用下一个可用的整数。最后一种情况,映射中不存在任何字符串,我们需要检查字符串是否相等,如果您的输入是[("s0", "s0")],我们期望[(0, 0)]。如果它们相等,我们将它们映射到相同的数字,否则创建不同的数字。

    如果您不熟悉仿函数,前 5 行正在创建一个满足 ORD_KEY 签名的结构。您可以在文档中找到更多详细信息

    1. http://www.smlnj.org/doc/smlnj-lib/Manual/ord-map.html
    2. http://www.smlnj.org/doc/smlnj-lib/Manual/ord-key.html#ORD_KEY:SIG:SPEC

    通过将ReBlackMapFn 函子应用于StringKey 结构,它创建了一个新的映射结构(实现为红黑树),将字符串映射到'a 类型的事物

    【讨论】:

    • 好的...我认为这更容易,我正在以另一种完全不同的方式接近它。非常感谢!我将阅读文档以了解更多信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 1970-01-01
    • 1970-01-01
    • 2021-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多