2017-07-03 3 views
0

マップをフィルタリングする必要がありますが、フィルタは値を前のマップと比較する必要があり、フィルタリングされたマップは前回とは異なる値を持つ必要があります。ここでマップ値とクロージャーを比較する

は一例です:

Map to filter: {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
Return: {:key3 -20 :key5 10} 

私はこれを行うことができる方法の任意の暗示?

+1

あなたはソートマップではなく、まっすぐなマップを使用した場合の質問は 'ので、良いかもしれない(ソートマップ:KEY1 100:KEY2 10:KEY3 -20:KEY4 -10:KEY5 10)'。 * previous *の概念は理にかなっています。 –

+0

小さな(8エントリ未満)マップリテラルはすべてソートされていると私は理解しています。だから、この特定の例では、その罰金、しかし、より大きな例では、おそらくそうではありません。 – user12341234

+0

申し訳ありませんが、私の間違いは、実際のプログラムのように、このキーは日付になります、私はそれらのソートマップを作成することができます。 – Pituca292

答えて

2

partition-byは、シーケンスが値を変更するときに基づいてシーケンスをチャンクします。 partition-byに値の "signum"を見て、各チャンクの最初の結果のみを取るように指示することができます。

(->> {:key1 100 :key2 10 :key3 -20 :key4 -10 :key5 10} 
    (partition-by #(Integer/signum (val %))) 
    rest 
    (map first)) 

=> ([:key3 -20] [:key5 10]) 
+3

マップ内のキーは順序付けられていないので、確実に動作させるためには、「次の」キーが何を想定しているかを定義する必要があります。 – Lee

+0

私はあなたのコメントに同意するが、私はそれが私の答えではなく、質問の仕様に関する問題だと思う。 – user12341234

+0

最初の行と実際にソートされる行の両方に '(into(sorted-map)...) 'を使用し、OPが指摘したマップ結果を得るために'(map first)の後に 'を追加することをお勧めします。 – Josh

関連する問題