2024 Clojure现状调查!分享你的想法。

欢迎!请查看关于页面了解更多关于此信息的工作方式。

0
Collections

嗨!
我是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)])

现在,我必须遍历list3并创建一个新的集合,用"item1"替换列表3中的1(我的list3),用"rec1"(列表3中的第二个1)替换第二个1... 对于list3中的所有向量也是如此...

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

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

有什么建议吗?

1 个答案

0

选中
 
最佳答案

嗨,再次!

您的问题具有指示性。这里假设您必须以([1 (item1 item2 item3)] [2 (item21 item22 item33)])的方式存储数据,根据我昨天看到您的编码,您可能选择了一个不合适的数据结构(我可能使用了[{:id 1 :item shoes :price 14.96}, {:id 2 :item milk :price 1.98}])。方法会根据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
我没有选择数据结构,它在说明中就是这样提供的。
为了回答这个问题,第三列表是列表1和2的合并。
所以,对于列表3的第一个条目
1 = 记录的id
(1 1 3) = 1:第一个列表中记录的id | 1:第二个列表中记录的id | 3:随机数,在新集合中不需要改变。
by
好的。常见的建议是将这个问题视为构建一个新的第4个列表,该列表包含所有3个现有列表的元素。

仍然应该是您所需的`map`,您将必须调整应用到的函数,直到它做到您想要的事情。
by
非常感谢...经过调整和多次测试后,我找到了解决方案。
感激您的帮助!:)
...