搜索矢量字符串在Clojure中

时间:2014-11-18 14:54:01

标签: string vector clojure

我有这个字符串向量:

 ["a1" "b3" "q9" "c4" "l2" "b3"]

如果收到一封信,我想退回相应的号码。

所以,如果我正在搜索字母q,我想返回9.如果我正在搜索字母c,我想返回4.

此外,我不必使用向量来存储字符串;我只是认为这是最有意义的数据结构。

我考虑使用zipmap创建一个我可以搜索的地图,但我不确定如何将这些字符串分开。

5 个答案:

答案 0 :(得分:1)

效率非常低,Hash映射为排序映射提供了更快的访问(log32N hops)和(logN hops)。请参阅http://clojuredocs.org/clojure.core/hash-maphttp://clojure.org/data_structures

为完成而编辑:

(def v ["a1" "b3" "q9" "c4" "l2" "b3"])

(def my-map (apply hash-map (mapcat #(vector (subs % 0 1) (subs % 1)) v)))

(my-map "a")

=> 1

答案 1 :(得分:1)

您可以执行以下操作:

(apply hash-map (mapcat seq ["a1" "b3" "q9" "c4" "l2" "b3"]))
=> {\a \1, \b \3, \c \4, \l \2, \q \9}

除了seq,你可以使用一个函数将你的字符串转换成你想要的类型的东西,如果你想要的不是字符。

答案 2 :(得分:0)

将矢量转换为地图确实是一个好主意。您可以使用subs将字符串拉开。 (subs s 0 1)将字符串s的第一个字符作为字符串返回,(subs s 1)返回其余字符。

(def a-list ["a1" "b3" "q9" "c4" "l2" "b3"])
(def a-map
     (into {} (map (fn [s] [(subs s 0 1) (Integer/valueOf (subs s 1))])
                   a-list)))
;; => {"a" 1, "b" 3, "q" 9, "c" 4, "l" 2}
(get a-map "q")
;; => 9

答案 3 :(得分:0)

您可以通过将字符串作为参数解构为将值减少为映射的函数来从数字字符中拆分字母字符。然后使用搜索到的字符

(defn search-character-vector [v ch]
  ((reduce (fn [m [c n]] (assoc m c n)) {} v) ch)
)
(search-character-vector ["a1" "b3" "q9" "c4" "l2" "b3"] \q)

这将返回链接到character \ q

的字符\ 9

答案 4 :(得分:0)

您可以使用zipmap并重新查找。

(def strings 
  ["a1" "b3" "q9" "c4" "l2" "b3"])

(defn from-letter [l coll]
  (let [m (zipmap
           (map #(re-find #"[a-zA-Z]{1}" %) coll)
           (map #(re-find #"\d+" %) coll))]
    (try
      (Integer/parseInt (get m l))
      (catch Exception ex nil))))

user> (from-letter "a" strings)
1
user> (from-letter "b" strings)
3
user> (from-letter "c" strings)
4