2016-06-07 3 views
3

Что является лучшим способом получить неизвестный ключ от карты Clojure? Я попробовал это -Получить неизвестный ключ от Clojure Persistent Hash

(key {:a "test"}) 

, который бросает это -

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

Глядя на source code, это делает чувственное

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

Я также попытался this-

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

Что выбрасывает это -

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

Я понимаю, что я могу назвать keys, а затем вытащить сказал key из KeySeq, но мне было интересно, если есть простой способ сделать это с помощью одного вызова функции.

Это a related question с точки зрения взаимодействия. Спасибо за ввод.

+0

Если карта содержит только одну пару, то вектор из двух элементы могут работать лучше: '[: a" test "]' – DaoWen

+0

Это полезно. Я проверяю каждое значение ключа входящего хэша на существующий хеш, чтобы узнать, существует ли ключ, поэтому было бы проще работать с вектором на входящем. Спасибо за примечание. – nrako

ответ

3

(key (first {:a "test"})) доставит вам ключ от первой записи на карте, это то, что вы пытаетесь сделать?

+0

Да, я полагаю, это так. Наверное, я удивлен, что для «ключа» требуется объект Java. Спасибо за ввод. – nrako

+0

@nrako Все в Clojure является либо примитивом Java, либо Java-объектом. Дело в том, что 'key' берет запись * карты *, а не карту. –

1

Вы можете использовать key или val, чтобы извлечь ключ и значение частей одного 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) 
Смежные вопросы