1

sort-map-byとapplyでカスタムコンパレータを使用するのに問題があります。以下の式を機能させるにはどうすればよいですか?

(apply sorted-map-by > {1 "ab" 3 "cs" 2 "vs"})

以下の例外が発生します-

IllegalArgumentExceptionキーに値が指定されていません:[3 "cs"] clojure.lang.PersistentTreeMap.create(PersistentTreeMap.java:87)

4

2 に答える 2

5

既存のマップを使用してキーを並べ替えたい場合は、次を使用できますinto

(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})

これ(sorted-map-by >)は、空の並べ替えられたマップを返すために機能します。したがって、のような関数を使用するintoassoc、マップが並べ替えられた順序を維持している間、期待どおりに機能します。

;=> {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つおきに先行するキーの値にしようとしているため、エラーが発生します。

于 2013-03-24T15:28:12.280 に答える
1

apply関数に渡す引数の数がコンパイル時にわからない場合は、を使用します。したがって、最良の方法は使用することです

(into (sorted-map-by >) {1 "ab" 3 "cs" 2 "vs"})
于 2013-03-24T15:35:39.233 に答える