首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在结构中移动元素,可能使用拉链?

如何在结构中移动元素,可能使用拉链?
EN

Stack Overflow用户
提问于 2015-08-21 14:12:09
回答 2查看 282关注 0票数 2

我有这样的结构:

代码语言:javascript
复制
 [{"a" {"b" 1 "c" 2} 
   "children" [{"a" {"b" 3 "c" 4} "children" []}]}
  {"a" {"b" 5 "c" 6} "children" []}
  {"a" {"b" 7 "c" 8}
    "children" [{"a" {"b" 9 "c" 10} "children" []} {"a" {"b" 10 "c" 10} "children" []}]}]

我正在尝试写一个算法来在向量中移动和元素。例如,在最后一个元素中,它的children向量具有:

代码语言:javascript
复制
"children" [{"a" {"b" 9 "c" 10} "children" []} {"a" {"b" 10 "c" 10} "children" []}]

我的函数应该搜索特定的嵌套映射--比方说,查找映射,其中值10是其b属性的值。我会找到{"a" {"b" 10 "c" 10} "children" []}。一旦我找到它,我就需要用向量改变它的位置。让我们假设,children将变成:

代码语言:javascript
复制
 "children" [{"a" {"b" 10 "c" 10} "children" []} {"a" {"b" 9 "c" 10} "children" []}]

有了拉链,我能够遍历和定位嵌套的地图,但不知道如何在向量中移动它。

以下是我的拉链是如何创建的:

代码语言:javascript
复制
  (z/zipper #(contains? % "children") #(get % "children")  (fn [_ c] c) data-structure)
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-08-24 18:49:25

这能做我想做的事

代码语言:javascript
复制
(defn update-tree [editable? edit loc]
  (loop [loc loc]
    (if (z/end? loc)
    (z/root loc)
    (if (editable? (z/node loc))
      (recur (-> loc z/up (z/edit edit) z/up z/next))
      (recur (z/next loc))))))

但它只适用于这种精确的结构。嵌套更多的元素破坏了算法。

票数 1
EN

Stack Overflow用户

发布于 2015-08-24 12:19:47

作为使用幽灵的替代解决方案

代码语言:javascript
复制
  (def z [
          {"a" {"b" 1 "c" 2}
           "children" [{"a" {"b" 3 "c" 4}
                        "children" []}]}
          {"a" {"b" 5 "c" 6}
           "children" []}
          {"a" {"b" 7 "c" 8}
           "children" [{"a" {"b" 9 "c" 10}
                        "children" []}
                       {"a" {"b" 10 "c" 10}
                        "children" []}]}])


    (transform
      (walker (fn [x]
                (and
                  (vector? x)
                  (some
                    #(= 10
                        (get-in % ["a" "b"]))
                    x))))
      reverse
      z)

返回:

代码语言:javascript
复制
[{"a" {"b" 1, "c" 2}, "children" [{"a" {"b" 3, "c" 4}, "children" []}]}
 {"a" {"b" 5, "c" 6}, "children" []}
 {"a" {"b" 7, "c" 8},
  "children"
  ({"a" {"b" 10, "c" 10}, "children" []}
   {"a" {"b" 9, "c" 10}, "children" []})}]

备注:

  1. 步行者一直在走,所以如果你在寻找一个只有一次的转变,你应该以某种方式来适应这一点。我尝试将FIRST添加到转换向量中,但是即使在找到其中一个“b”之后,它仍然保持行走。
  2. 我尝试使用collect-one而不是get-in,但没有成功。

如果您找到了更好的解决方案,可以随意编辑它。我对幽灵还是陌生的。

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

https://stackoverflow.com/questions/32142532

复制
相关文章

相似问题

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