2016-06-07 32 views
3

從Clojure地圖獲取未知密鑰的最佳方式是什麼?我想這一點 -從Clojure持久哈希獲取未知密鑰

(key {:a "test"}) 

會拋出這一點 - 在source code

ClassCastException clojure.lang.PersistenArrayMap cannot be cast to java.util.Map$Entry 

來看,這也在情理之中

(defn key 
    "Returns the key of the map entry." 
    {:added "1.0" :static true} 
    [^java.util.Map$Entry e] 
    (. e (getKey))) 

我也試過這 -

(key (java.util.Map$Entry. {:a "test"})) 

其中拋出這個,

CompilerException java.lang.IllegalArgumentException: No matching ctor found for interface java.util.Map$Entry 

我明白,我可以打電話keys然後拉說keyKeySeq,但我很好奇,如果有一個簡單的方法,用一個函數調用來做到這一點。

就互操作而言,這是a related question。感謝您的意見。

+0

如果地圖僅包含一對,那麼兩個向量元素可能會更好地工作:'[:a「test」]' – DaoWen

+0

這很有幫助。我正在檢查傳入哈希的每個關鍵值與現有哈希的關鍵值,以查看關鍵字是否已存在,因此在傳入時使用向量可能會更簡單。謝謝你的提示。 – nrako

回答

3

會讓你在地圖中的第一個條目的關鍵,是你正在嘗試做什麼?

+0

是的,我想是的。我猜我很驚訝'key'需要一個Java對象。感謝您的意見。 – nrako

+0

@nrako Clojure中的所有東西都是Java原語或Java對象。關鍵是'key'需要地圖*條目*,而不是地圖。 –

1

您可以使用keyval來提取單個MapEntry的鍵和值部分。對於你的問題,它可能是更容易使用keys功能(注意是複數)來獲取所有的鍵從地圖作爲一個序列:

(keys {:a "test"}) 
;=> (:a) 

(keys {:a "test" :b "again"}) 
;=> (:a :b) 

; please remember that the keys do not have to be keywords 
(keys {1 11 2 22}) 
;=> (1 2)