sort-map-byとapplyでカスタムコンパレータを使用するのに問題があります。以下の式を機能させるにはどうすればよいですか?
(apply sorted-map-by > {1 "ab" 3 "cs" 2 "vs"})
以下の例外が発生します-
IllegalArgumentExceptionキーに値が指定されていません:[3 "cs"] clojure.lang.PersistentTreeMap.create(PersistentTreeMap.java:87)
sort-map-byとapplyでカスタムコンパレータを使用するのに問題があります。以下の式を機能させるにはどうすればよいですか?
(apply sorted-map-by > {1 "ab" 3 "cs" 2 "vs"})
以下の例外が発生します-
IllegalArgumentExceptionキーに値が指定されていません:[3 "cs"] clojure.lang.PersistentTreeMap.create(PersistentTreeMap.java:87)
既存のマップを使用してキーを並べ替えたい場合は、次を使用できますinto
。
(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})
これ(sorted-map-by >)
は、空の並べ替えられたマップを返すために機能します。したがって、のような関数を使用するinto
とassoc
、マップが並べ替えられた順序を維持している間、期待どおりに機能します。
;=> {3 "cs", 2 "vs", 1 "ab"}
このsorted-map-by
関数はフラット引数で機能します。
(sorted-map-by > 1 "ab" 3 "cs" 2 "vs")
;=> {3 "cs", 2 "vs", 1 "ab"}
これをこのマップに適用すると、奇数のペアが得られます。
(apply list {1 "ab" 3 "cs" 2 "vs"})
;=> ([1 "ab"] [2 "vs"] [3 "cs"])
そして、1つおきに先行するキーの値にしようとしているため、エラーが発生します。
apply
関数に渡す引数の数がコンパイル時にわからない場合は、を使用します。したがって、最良の方法は使用することです
(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})