构建地图列表

时间:2011-06-06 11:09:49

标签: clojure

首先,我是一名Clojure初学者,因为我的英语不好而感到厌烦。

假设您有一个函数被假定为返回包含各种信息的地图列表(在此示例中为系统信息)。

我已经提出了以下示例,但它似乎是错误的并且过于复杂。

我的问题是'对于[disk(File / listRoots)'已经返回一个列表,我必须合并2个列表才能获得所需的输出,为此必须存在更好的解决方案。

我希望你们中的某些人能够以更加'Clojure'的方式告诉我如何做到这一点。

(import
[java.lang Runtime System]
[java.io File])

(defn get-sysinfo []
(let [basic-info (list 
                {:name "Processor Count:", :value (. (Runtime/getRuntime) availableProcessors)}
                {:name "OS Name:", :value (System/getProperty "os.name")}
                {:name "OS Arch:", :value (System/getProperty "os.arch")}
                {:name "User Name:", :value (System/getProperty "user.name")}
                {:name "Java Version:", :value (System/getProperty "java.version")})]
  (concat basic-info (for [disk (File/listRoots)]
                       {:name (str "Disk " (. disk getAbsolutePath)), :value (str "Free Space " (float (/ (. disk getFreeSpace) (* 1024 1024 1024))) " GB")}))))

提前致谢

马库斯

2 个答案:

答案 0 :(得分:1)

由于您正在使用(for ...)转换每个元素,因此map似乎更合乎逻辑。你不能真正避免合并两个列表,因为一个是“固定的”而另一个是后来从文件列表中生成的。

使用(.methodName对象)而不是(.object methodName)也更惯用 - 尽管这纯粹是一种风格问题。

我会这样做:

(defn get-sysinfo []
  (concat (list 
           {:name "Processor Count:", :value (. (Runtime/getRuntime) availableProcessors)}
           {:name "OS Name:", :value (System/getProperty "os.name")}
           {:name "OS Arch:", :value (System/getProperty "os.arch")}
           {:name "User Name:", :value (System/getProperty "user.name")}
           {:name "Java Version:", :value (System/getProperty "java.version")})
          (map #(hash-map :name (str "Disk " (.getAbsolutePath %)),
                          :value (str "Free Space "
                                      (float (/ (.getFreeSpace %) (* 1024 1024 1024)))
                                      " GB"))
               (File/listRoots))))

答案 1 :(得分:1)

您还可以使用小list*助手。它根据给定元素创建一个列表。最后一个作为尾部列表。所以“合并”是隐含的。

(defn get-sysinfo
  []
  (list*
    {:name "Processor Count:" :value (.availableProcessors (Runtime/getRuntime))}
    {:name "OS Name:", :value (System/getProperty "os.name")}
    {:name "OS Arch:", :value (System/getProperty "os.arch")}
    {:name "User Name:", :value (System/getProperty "user.name")}
    {:name "Java Version:", :value (System/getProperty "java.version")}
    (for [disk (File/listRoots)]
      {:name  (str "Disk "       (.getAbsolutePath disk))
       :value (str "Free Space " (float (/ (.getFreeSpace disk)
                                           (* 1024 1024 1024)))
                   " GB")})))

但是,也许你真的想要回一张地图?

(defn get-sysinfo-map
  []
  (into {"Processor Count" (.availableProcessors (Runtime/getRuntime))
         "OS Name"         (System/getProperty "os.name")
         "OS Arch"         (System/getProperty "os.arch")
         "User Name"       (System/getProperty "user.name")
         "Java Version"    (System/getProperty "java.version")}
        (for [disk (File/listRoots)]
          [(str "Disk " (.getAbsolutePath disk))
           (float (/ (.getFreeSpace disk) (* 1024 1024 1024)))])))