我有一个问题可以说是这种情况。
有三种不同的书籍:医学书籍,艺术书籍和历史书。每本书都有三个层次:初级、中级、高级。
这些书将放在书架上。
问题是比较两种不同书架的差别。
我把这个问题抽象为两个字符串列表。
例如:
现在,书架可以定义为"A1“、"H2”、"M3“。
问题:
有多少本书是一样的?(同一职类,同职等)
有多少本书有相同的类别但错误的级别?(不包括同一本书)
有多少本书有相同的水平,但却有错误的类别?(不包括同一本书)
顺便说一句,同样的书不是放在同一个书架上,这意味着列表中的每一个元素都是唯一的,而不管书的顺序如何。
示例
“A1”、"H2“、"M3”-> (1本相同的书、1本同类别的书、2本同级别的书) -> (1,1,2本) "H3“、"M2”、"A2“-> (0本相同的书、2本同类别的书、1本同级别的书) -> (0,2,1) "A1","H1","M1”-> (0本相同的书,3本相同的书,0本同水平的书) -> (0,3,0)
当我数同一类别的书有不同的级别或同一级别的书有不同的类别时,有时我得到超过3.
发布于 2017-09-02 16:55:26
您想要的函数在 module中,所以请导入它。您还需要来自on的Data.Function函数。
与其将书籍表示为像"H1“这样的双元素列表,不如将它们做成对:('H', 1)。它使生活变得容易多了,你不必担心无效的头衔。
你问题的最后一点是,你的书架上从来没有两本书。这意味着每个书架都是一套书。Data.List模块包括一些集函数。例如,两个列表中相同的书籍是由intersect提供的,而书架上的书,而不是另一个书架上的书是由(\\)提供的。您还可以使用这些函数的By变体,例如intersectBy。每个函数都需要一个函数来代替(==)。如果像我前面所建议的那样,用一对书来表示一本书,那么您可以像下面这样构造这些函数:
zs = intersectBy ((==) `on` fst) xs yshttps://stackoverflow.com/questions/46015693
复制相似问题