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中,创建一个新的集合,将my list3中的1替换为"item1",将第二个1(在my list3中)替换为"rec1"……以此类推,为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是否是真正的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

我没有选择数据结构,它是在指示中给出的这种方式。
为了回答问题,第三个列表类似于列表1和2的合并。
所以,对于列表3的第一个记录
1 = 记录的ID
(1 1 3) = 1: 第一个列表中记录的ID | 1: 第二个列表中记录的ID | 3 : 新集合中不需要改变的随机数。
好的。流行的建议是将这个问题视为构建一个新的第四个列表,它包含所有三个现有列表的元素。

映射(map)仍然应该是您需要的,您将不得不调整应用函数,直到它能完成您需要的功能。
非常感谢... 经过适配和多次测试后,我明白了。
感谢帮助!:(
...