【问题标题】:How do I sort a nested sequence in clojure?如何在clojure中对嵌套序列进行排序?
【发布时间】:2020-09-20 03:29:08
【问题描述】:

我有一个嵌套映射,其中的键是数字,如下所示:

{:18 [Lan Yuhong 165 Happy Lane 345-4533], :33 [Man Yuhong 165 Happy Lane 345-4533], :3 [Tan Yuhong 165 Happy Lane 345-4533], :6 [Jan Yuhong 165 Happy Lane 345-4533], :5 [Han Yuhong 165 Happy Lane 345-4533], :7 [Fan Yuhong 165 Happy Lane 345-4533], :1 [Sue Jones 43 Rose Court Street 345-7867], :9 [John Smith 123 Here Street 456-4567]}

我想根据第一个条目(即键)进行排序,如下所示:

{:1 [Sue Jones 43 Rose Court Street 345-7867], :3 [Tan Yuhong 165 Happy Lane 345-4533], :5 [Han Yuhong 165 Happy Lane 345-4533], :6 [Jan Yuhong 165 Happy Lane 345-4533], :7 [Fan Yuhong 165 Happy Lane 345-4533], :9 [John Smith 123 Here Street 456-4567], :18 [Lan Yuhong 165 Happy Lane 345-4533], :33 [Man Yuhong 165 Happy Lane 345-4533]}

但是,每个列表中的第一个条目被视为字符串而不是整数,sort/sort-by 返回一个按字典顺序排序的列表,如下所示。请注意,mps 存储在我的程序中的new-map 变量中。

(do
    (into (sorted-map) new-map)
)

输出是:

([1 Sue Jones 43 Rose Court Street 345-7867] [18 Lan Yuhong 165 Happy Lane 345-4533] [3 Tan Yuhong 165 Happy Lane 345-4533] [33 Man Yuhong 165 Happy Lane 345-4533] [5 Han Yuhong 165 Happy Lane 345-4533] [6 Jan Yuhong 165 Happy Lane 345-4533] [7 Fan Yuhong 165 Happy Lane 345-4533] [9 John Smith 123 Here Street 456-4567])

如何在不使用任何循环的情况下做到这一点?我试图避免在这里使用循环。但是,递归函数是可以的。

【问题讨论】:

  • 我已回滚您的最新编辑。内容与标题不符,代码示例显然无法做到你所说的那样(你忘了完成编辑它们),这使得 Alan Thompson 的现有答案看起来有点奇怪,因为它正在回答你的问题似乎没有问。请保持问题编辑与最初提出的问题大致一致。

标签: recursion clojure functional-programming nested-lists


【解决方案1】:

你几乎拥有它。只需添加:

(sort-by #(Integer/parseInt (first %)) new-list)

完整代码:

(ns tst.demo.core
  (:use tupelo.core tupelo.test))

(dotest
  (let [data [["18" "Lan Yuhong" "165" "Happy Lane" "345-4533"]
              ["33" "Man Yuhong" "165" "Happy Lane" "345-4533"]
              ["3" "Tan Yuhong" "165" "Happy Lane" "345-4533"]
              ["6" "Jan Yuhong" "165" "Happy Lane" "345-4533"]
              ["5" "Han Yuhong" "165" "Happy Lane" "345-4533"]
              ["7" "Fan Yuhong" "165" "Happy Lane" "345-4533"]
              ["1" "Sue Jones" "43" "Rose Court Street" "345-7867"]
              ["9" "John Smith" "123 Here Street" "456-4567"]]]
    (spyx-pretty (sort-by #(Integer/parseInt (first %)) data))))

结果

(["1" "Sue Jones" "43" "Rose Court Street" "345-7867"]
 ["3" "Tan Yuhong" "165" "Happy Lane" "345-4533"]
 ["5" "Han Yuhong" "165" "Happy Lane" "345-4533"]
 ["6" "Jan Yuhong" "165" "Happy Lane" "345-4533"]
 ["7" "Fan Yuhong" "165" "Happy Lane" "345-4533"]
 ["9" "John Smith" "123 Here Street" "456-4567"]
 ["18" "Lan Yuhong" "165" "Happy Lane" "345-4533"]
 ["33" "Man Yuhong" "165" "Happy Lane" "345-4533"])

更新

对于您修改后的问题,see the functiongroup-by

【讨论】:

  • 感谢您的快速回答。这就是我一直在寻找的解决方案,并且正是我需要的。我将查看更新问题的分组功能,或者看看我是否可以利用排序列表来创建排序地图。
猜你喜欢
  • 2019-06-04
  • 2013-02-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-04-29
相关资源
最近更新 更多