对于类项目的一部分,我需要在一个代表Clojure中的图形的文件中读取。这是一个link to示例文件。我可能读到的所有文件的文件结构都是这样的
c Unknown number of lines
c That start with "c" and are just comments
c The rest of the lines are edges
e 2 1
e 3 1
e 4 1
e 4 2
e 4 3
e 5 1
e 5 2
我遇到的问题是尝试split
基于空格的行。在我的REPL中,我已经完成了
finalproject.core> (.split "e 1 2" " ")
#<String[] [Ljava.lang.String;@180f214>
其中,我不确定它究竟意味着什么......我认为它指的是String[]
的内存位置我不知道为什么它会像那样显示。如果在分割字符串前面插入#
,我认为这表示它是正则表达式我收到错误
finalproject.core> (.split "e 1 2" #" ")
ClassCastException java.util.regex.Pattern cannot be cast to java.lang.String
目前我对这个模块的整个实现是,如果我能正确使用split
函数,我相信我会很有用。
(defn lineToEdge [line]
(cond (.startsWith line "e")
(let [split-line (.split line " ")
first-str (split-line 1)
second-str (split-line 2)]
((read-string first-str) (read-string second-str)))))
(defn readGraphFile [filename, numnodes]
(use 'clojure.java.io)
(let [edge-list
(with-open [rdr (reader filename)]
(doseq [line (line-seq rdr)]
(lineToEdge line)))]
(reduce add-edge (empty-graph numnodes) edge-list)))
我没有机会以任何方式测试readGraphFile
但是当我尝试使用lineToEdge
进行虚拟输入时,我收到错误
finalproject.core> (lineToEdge "e 1 2")
ClassCastException [Ljava.lang.String; cannot be cast to clojure.lang.IFn
关于我哪里出错的建议?
答案 0 :(得分:2)
在下文中,您的返回值是String类型的数组。
finalproject.core> (.split "e 1 2" " ")
#<String[] [Ljava.lang.String;@180f214>
要在Clojure中更方便地使用它,你可以把它放到一个矢量中:
user=> (vec (.split "e 1 2" " "))
["e" "1" "2"]
您还可以使用内置的clojure.string
命名空间:
user=> (require '[clojure.string :as string])
nil
user=> (string/split "e 1 2" #" ")
["e" "1" "2"]
堆栈跟踪的来源是:
(let [split-line (.split line " ")
first-str (split-line 1)
second-str (split-line 2)] ...)
这会通过.split
获取一个字符串数组,然后尝试将其称为函数。也许您打算在这里使用get
来按索引访问List的元素? (get split-line 1)
将从索引1处的split-line
获取元素,等等。
你会在这里看到另一个问题:
((read-string first-str) (read-string second-str))
如果我正确地阅读你的代码,这将最终调用一个数字,好像它是一个函数,另一个数字作为参数。也许你打算返回一对数字?
[(read-string first-str) (read-string second-str)]