【问题标题】:Tree structure with duplicate leafs in UITableView in swiftswift中UITableView中具有重复叶子的树结构
【发布时间】:2018-04-20 20:07:11
【问题描述】:

我正在创建一个带有tableView 的菜单,最终导致用户输入某个参数,然后输出结果。

菜单由多个页面组成,根据用户选择的内容,它会提供不同的用户输入。它与 iPhone 的设置非常相似。

现在,我对菜单建模的方式是使用树形结构:

class Node {

    let value: Modules

    var parentNode: Node?
    var childenNode = [Node]()

    var childCount: Int {
        return childenNode.count
    }

    func appendNode(node: Node) {
        childenNode.append(node)
        node.parentNode = self
    }

    func isLeaveNode() -> Bool {
        return childenNode.isEmpty
    }

    init(module: Modules) {
        self.value = module
    }              
}

它是一种非常简单典型的树形数据结构。我的问题是,可能有重复的节点,这意味着父节点将被覆盖。例如,给定这样的结构:

             [1] 
           /     \
       [2]         [3]
      /               \
   [4]                 [4]

如果我用我的代码对这棵树进行建模,它将如下所示:

let node1 = Node(.1)
let node2 = Node(.2)
let node3 = Node(.3)
let node4 = Node(.4)

node1.appendNode(node2)
node1.appendNode(node3)

node2.appendNode(node4)
node3.appendNode(node4)

由于节点 4 的外观是不是唯一的,因此 node4 的父节点将被覆盖,父节点现在是 node3。而node2node3 应该共享同一个叶子。我应该如何更改我的代码,以便任何给定的叶节点可以有多个父节点?

附加信息:Modulesenum。只需创建更多enum 成员即可轻松解决此问题,但是还有其他解决问题的方法吗?

欢迎提出任何建议!

谢谢!

【问题讨论】:

  • 你在为模块使用枚举吗?
  • 是的,我是。模块是枚举
  • 您在问:“我应该如何更改我的代码,以便我的叶节点可以有不同的父节点?”但唯一具有相同父节点的节点是 node2 和 node3。您不希望 node2 和 node3 共享父节点吗?为什么不想要这个?
  • 节点 4 需要有多个父节点。目前,节点 4 只能有一个父节点。我确实希望 node2 和 node3 具有相同的父级。我想要的是节点拥有多个父节点而不创建更多枚举案例。
  • 如果我的回答不能解决您的问题,请告诉我。

标签: swift uitableview data-structures tree


【解决方案1】:

Modules 似乎是一个枚举,因此是一个值。如果Modules 确实具有值语义,那么您只需创建两个不同的Node(.4)。每个人都有一个单独的父母。不要保留node4 变量,而是信任您的树结构并自信地在其中导航。

node2.appendNode(Node(.4))
node3.appendNode(Node(.4))

您需要重新考虑我们的类以及如何更直观地构建树。也许类似于

init(_ module: Module, children: [Node] = [Node]()) {
  self.value = module
  self.children = children
  foreach child in self.children {
    child.parent = self
  }
}

现在你可以像这样初始化你的树了。

let root =
      Node(.1, children:
      [
        Node(.2, children: [Node(.4)]),
        Node(.3, children: [Node(.4)])
      ])

【讨论】:

  • 是的,解决这个问题的一种方法是拥有两个不同的Node(.4),但它们意味着我的enum 结构将被这些新的枚举成员淹没,是否有另一种方法来实现这一点必须创建新实例?
  • 我们没有足够的信息来解决这个问题。我不确定问题是什么。为什么会出现大量的枚举案例?不会有比之前的 .1、.2、.3 和 .4 更多的东西了。如果具有相同 Module 值的两个节点的行为因父节点而异,那么您将需要以某种方式将该信息添加到节点的状态和逻辑中,但它不会影响结构(据我们所知)。
  • @BrendonCheung,我很确定我的回答可以满足您的问题。如果没有,你能告诉我吗?
  • @PriceRingo "为什么会有大量的枚举案例?",如果我们使用上面的案例,那么会有两个 node[.4] 代表同一件事。这里的问题是(抱歉,如果没有正确定义,我会更新帖子)我需要node[.4]node[.2]node[.3] 作为父母。我现在的代码无法实现这一点,因为如果我将node2 附加到node4,然后将node3 附加到node4,则node2 作为父级将被覆盖。
  • @ScottyBlades 感谢您的帮助,还有其他不使用数组的吗?这样做的原因是当用户到达用户输入页面时,我需要知道用户所走的路径,如果我有一组父母,我不知道用户选择了什么。谢谢
【解决方案2】:

你可以改变

var parentNode: Node?var parentNodes: [Node?]

func appendNode(node: Node) {
    childenNode.append(node)
    node.parentNodes.append(self)
}

但是,这是不好的做法。您将不再拥有一棵树,而是一个图表。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多