2013-11-28 50 views
2

在Racket中是否有内置函数,我们可以根据值而不是值的顺序来检查两个列表的相等性?比较Racket中的两个列表

例如,如果比较'(1 2 2 3 4 5)和'(3 1 2 5 4),它应该返回true。

或者实现这种功能的最简单方法是什么?

回答

7

如果出现的次数并不重要,那么您在做设置比较。您可以将列表转换成集,然后比较集:

> (equal? (list->set '(1 2 3 4 5)) (list->set '(5 4 3 2 1))) 
#t 

如果出现的次数的确很重要,你做多集比较。一个简单的方法来做这种常见的价值观是排序两个列表,然后比较他们的平等以通常的方式:

> (equal? (sort '(3 2 1 4 5) <) (sort '(2 1 3 4 5) <)) 
#t 
> (equal? (sort '(1 2 1) <) (sort '(2 1) <)) 
#f 
+1

谢谢。但是这个解决方案中的问题是,如果我们的清单中有重复的内容?例如比较'(1 2 1)和'(2 1)。 – Elik

+3

@Elik您没有在您的问题中提及重复项,并且您的示例没有重复项。 svk回答了你问的问题 - 并给了你两种方法来做到这一点。你可以通过Stack Overflow搜索“[racket] remove duplicates”,并将其与他的答案结合起来。 –

+1

@Greg Hendershott,我认为我的问题是一个普遍的问题。 svk并没有提到第二个解决方案,他在我的评论之后编辑了他的评论。你不必在此写任何虚假的假设。 – Elik