2024 Clojure 状态调查!中分享您的看法。

欢迎!请参考关于页面,了解更多有关如何使用本网站的信息。

0
集合

嗨!
我是 Clojure 的初学者,我在处理数据结构中的数据循环方面遇到困难。

我有一个看起来像这样的列表:(list1)
[[1 (item1 item2 item3)]
[2 (item21 item22 item33)]]

另一个列表的例子: (list2)
[[1 (rec1 rec2 rec3)]
[2 (rec21 rec22 rec33)]]

最后一个列表是:(list3)
([1 (1 1 3)]
[2 (2 2 3)])

现在,我需要循环到列表3,创建一个新的集合,用“item1”替换列表3中的第一个1,用“rec1”替换列表3中的第二个1 ... 然后将所有向量集中的情况继续下去...

这三个列表具有相同的记录数量。

我的第三个列表应该看起来像这样:
[[1 (item1 rec1 3)]]
[[2 (item21 rec22 3)]]

有什么思路吗?

1 答案

0

selected
 
最佳答案

嗨,再来!

您的问题是规范性的。存在这样一个假设,您必须将数据存储为([1 (item1 item2 item3)] [2 (item21 item22 item33)])形式,从我昨天看到您的代码推测,您可能选择了不合适的数据结构(我可能也使用了[{:id 1 :item shoes :price 14.96}, {:id 2 :item milk :price 1.98}])。方法根据id是否是真正的id以及每个项目的唯一性而改变。我会尝试使用clojure.set函数(https://clojure.github.io/clojure/clojure.set-api.html),因为它们非常适合此类操作,您真的需要使用clojure.set/joinclojure.set/select然后clojure.set/project

此外,我认为您要求的是map,这是一个流行的函数,您可以在https://docs.clojure.org/clojure.core/map上看到其文档。

(map
 (fn [x y z] [(first x) 
              (list (first (second x)) 
                    (first (second y)) 
                    (nth (second z) 2))])
 list1
 list2
 list3)

这并不完全符合您的要求,我无法解释为什么您选择了rec1作为1但选择了rec22作为2

by
数据结构不是我选择的,它是在说明中给出的。
为了回答这个问题,第3个列表就像是合并了列表1和2。
所以,对于列表3的第一个记录
1 = 记录的id
(1 1 3) = 第1个列表中记录的id | 第2个列表中记录的id | 新集合中不必更改的随机数。
by
好吧。常见的建议是考虑将该问题视为构建一个新的4个列表来包含所有3个现有列表的元素。

依然需要一个`map`,您可能需要调整应用函数,直到它做到您想要的。
by
非常感谢... 在适应和多次测试之后,我弄懂了。
谢谢帮助!:)
...