首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >更好的遍历地图地图的方法

更好的遍历地图地图的方法
EN

Stack Overflow用户
提问于 2012-06-21 21:16:33
回答 2查看 631关注 0票数 2

我正在做一些数据分析聚合,下面是我的数据结构:

代码语言:javascript
复制
{
12300 {
   views {
       page-1 {
          link-2  40
          link-6  9
       }
       page-7 {
          link-3  9
          link-11 8
       }
   }
   buttons {
       page-1 {
          link-22 2
       }
   }
}
34000      ....
}

其中12300,34000是时间值。

我想要做的是遍历该数据结构并将条目插入到数据库中,如下所示:

代码语言:javascript
复制
insert into views (page, link, hits, time) values (page-1, link-2, 40, 12300)
insert into views (page, link, hits, time) values (page-1, link-6, 9, 12300)

对此进行编码的惯用方法是什么?我是不是让数据结构复杂化了?你有没有更好的收集数据的方法?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2012-06-22 03:11:40

假设您有一个来自clojure.java.jdbc的jdbc连接,这应该是您想要的结果。

代码语言:javascript
复制
(jdbc/do-prepared "INSERT INTO views (page, link, hits, time) VALUES (?, ?, ?, ?)"
                  (for [[time data] m
                        [data-type page-data] data
                        [page links] page-data
                        [link hits] links]
                    [page link hits time]))
;; why aren't we using data-type, eg buttons?

编辑已澄清的问题

代码语言:javascript
复制
(let [m '{12300 {views {page-1 {link-2  40
                                link-6  9}
                        page-7 {link-3  9
                                link-11 8}}
                 buttons {page-1 {link-22 2}}}
          34000 {views {page-2 {link-2 5}}}}]
  (doseq [[table rows] (group-by :table (for [[time table] m
                                              [table-name page-data] table
                                              [page links] page-data
                                              [link hits] links]
                                          {:table table-name, :row [page link hits time]}))]
    (jdbc/do-prepared (format "INSERT INTO %s (page, link, hits, time) VALUES (?, ?, ?, ?)" table)
                      (map :row rows))))
票数 8
EN

Stack Overflow用户

发布于 2012-06-21 22:14:21

简单的解决方案:利用您正在使用地图的事实,并使用get-in、assoc-in函数来查看/更改数据。请参阅以下示例:

http://clojuredocs.org/clojure_core/clojure.core/get-in http://clojuredocs.org/clojure_core/clojure.core/assoc-in

高级解决方案:使用功能性拉链。这允许您以功能方式遍历和更改树状结构。

这里有一个例子:http://en.wikibooks.org/wiki/Clojure_Programming/Examples/API_Examples/Advanced_Data_Structures#zipper

如果您有特殊的数据结构,而不是map的map,那么您可以通过简单地实现3个必需的方法来自己创建一个拉链。在那之后,所有的zipper函数也将在你的数据结构上工作。

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/11139041

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档