有没有更好的方法从分类地图中分离头部或尾部范围?

时间:2013-02-06 23:21:38

标签: clojure

在Java中,使用java.util.SortedMap<Long,Object>,我们可以执行以下操作:

sortedMap.headSet(13).clear()

用键&lt;去除所有元素13.对于clojure的(sorted-map)(我认为总是clojure.lang.PersistentTreeMap),我在clojure.core中看不到任何类似内容。我提出的最好的是这样的:

(let [clear-up-to 13
      sm (sorted-map 1 "aye" 2 "bee" 13 "em" 14 "en")]
      clear-keys (take-while #(< % clear-up-to) (keys sm))
  (apply dissoc sm clear-keys))

我错过了一些更简单的东西吗?

2 个答案:

答案 0 :(得分:1)

虽然使用java.util.SortedMap在许多情况下是完全合理的,但我认为对于内置的sorted-map一般没有更高效的解决方案。特别是如果你在砍掉它之后把它变成一张持久的地图。

对于它的价值,也可以使用reduce

编写
user> my-sorted-map
{2 1, 4 3, 6 5, 8 7}

user>  (reduce dissoc my-sorted-map (take-while #(< % 5) (keys my-sorted-map)))
{6 5, 8 7}

虽然这主要是品味问题。你的榜样也很好。

答案 1 :(得分:1)

Dissoc是您可以做的最好的,但take-while步骤应根据需要替换为subseqrsubseq