clojure中的`.split`方法返回意外结果

时间:2015-03-27 23:21:06

标签: string clojure

对于类项目的一部分,我需要在一个代表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

关于我哪里出错的建议?

1 个答案:

答案 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)]