我有一个问题可以说是这种情况。
有三种不同类别的书:医学书,艺术书和历史书。 每本书都有三个级别:小学,中级,高级。
这些书将放在书架上 问题是比较两个不同书架的差异。
我把这个问题抽象为两个字符串列表。
例如:
现在,书架可以定义为[" A1"," H2"," M3"]。
问题:
顺便说一句,相同的书籍不会放在同一个书架上,这意味着列表中的每个元素都是唯一的,无论书的顺序如何。
实施例
["A1","H2","M3"] ["A1","H3","A2"] -> (1 same book, 1 same category book, 2 same level books) -> (1,1,2)
["H3","M2","A2"] ["H2","M1","H1"] -> (0 same book, 2 same category books, 1 same level book) -> (0,2,1)
["A1","H1","M1"] ["A2","H2","M2"] -> (0 same book, 3 same catefory books, 0 same level book) -> (0,3,0)
当我计算不同级别或同级别书籍的不同类别的同一类别书时,有时我得到超过3 ...
答案 0 :(得分:1)
您想要的功能位于Data.List
module,因此请将其导入。您还需要Data.Function
中的toString
功能。
不要将书籍表示为像" H1"这样的双元素列表,而应将它们配对:on
。它让生活变得更轻松,而且你不必担心无效的头衔。
你问题的最后一点说你从来没有在书架上有两本书。这意味着每个书架都是一套书。 ('H', 1)
模块包含一些设置功能。例如,两个列表中相同的书籍由Data.List
给出,而一个书架而不是另一个书架上的书籍由intersect
给出。您还可以使用这些函数的(\\)
变体,例如By
。其中每个都使用函数而不是intersectBy
。如果您按照我上面的建议代表一对书,那么您可以构建这样的函数:
(==)