以下是我的文件和函数:
清单1.txt =>猫狗虎熊
List2.txt =>猫狗虎
这些文件是在winodws xp上进行ANSI编码的。
(defun get-file (filename)
(with-open-file (stream filename)
(loop for line = (read-line stream nil)
while line collect line)))
(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))
(set-difference *file1* *file2*)我认为输出应该是“熊”。但是,它返回(“猫”、“狗”、“虎”、“熊”)作为差异。我假设这是由于我从文件中读取信息,但我被困在那里了。谢谢您抽时间见我。
发布于 2013-04-11 22:45:16
Common Lisp使用EQL作为默认测试。你想要string-equal或类似的东西。
CL-USER > (set-difference '("cat" "dog" "tiger" "bear")
'("cat" "dog" "tiger")
:test #'string-equal)
->
("bear")发布于 2013-04-11 23:12:08
除了Rainer已经提到的set-difference的:test关键字参数之外,您的代码中还有另一个问题。您的函数get-file将返回一个行列表,其中每行都是一个字符串。您可能希望将这些行拆分成单词。你可以使用split-sequence函数很容易做到这一点(谷歌搜索split-sequence Common Lisp包,或者通过
(ql:quickload :split-sequence)如果您安装了quicklisp。因此,您的函数可能如下所示,例如:
(defun get-file (path)
(with-open-file (s path)
(let* ((len (file-length s))
(data (make-string len)))
(read-sequence data s)
(mapcar #'(lambda (string) (string-trim '(#\Space #\Tab #\Newline) string))
(split-sequence:split-sequence '#\Space data :remove-empty-subseqs t)))))
(defparameter *file1* (get-file "list1.txt"))
(defparameter *file2* (get-file "list2.txt"))
(format t "~s~%" (set-difference *file1* *file2* :test #'string-equal))这将正确地打印:
("bear")https://stackoverflow.com/questions/15951492
复制相似问题