所有数组元素的访问子节点

时间:2018-09-11 05:09:32

标签: swift data-structures

我有一个带有以下对象的对象数组。它包含子属性,该子属性实际上是具有相同类型的另一个对象数组,并且此结构继续进行。 我现在真正想要的是要访问数组中所有元素的所有子元素。

  class Group
    {
        var groupinfo:NSDictionary?
        var groupBalanceInfo:NSDictionary?
        var collapsed=true
        var haveChilds=false
        var groupHieght=30.0
        var child:Any?
        var level:Int?
        var queryString:String?
        var parentIndex = [Int]()
        var index = 0
    }

我正在尝试查找所有子级和子级子级的计数,我尝试了以下操作,但似乎不起作用。

func calculateCount()->Int
   {
   var allElementCount = 0
        var groups = agBalances.groups!
        for loop  in groups
        {
            if loop.child != nil
            {
                groups = loop.child as! [Group]
                allElementCount=allElementCount+groups.count
                continue
            }
        }
        return allElementCount
    }

3 个答案:

答案 0 :(得分:3)

对于树,您需要一个可自行调用的递归函数。

我建议将 children 声明为非可选的空数组,而不是单数名称( child )和未指定的Any?

var children = [Group]()

递归函数采用两个inout参数,即计数器和(子)组。

func calculate(count: inout Int, in group: inout [Group])
{
    if !group.isEmpty {
        count += group.count
        for child in group {
            calculate(count: &count, in: &child.children)
        }
    }
}

并命名为

var groups = agBalances.groups!
var groupCount = 0

calculate(count: &groupCount, in: &groups)

答案 1 :(得分:1)

这是一种根据您的Group模型获取所有子级和子级子级的方法

var count = 0
func getCount(groups: [Group]) -> Int {
    for group in groups {
        count += 1
        // recursive call of function for child
        if let child = group.child as? [Group] {
            getCount(groups: child)
        }
    }
    return count }

答案 2 :(得分:-1)

这是我使用递归解决的方法

  func calculateCount(groups:[Group])->Int
    {
        countElements=0
        var allElementCount = 0
        var groups = agBalances.group!
        for loop  in groups
        {
            allElementCount = search(childrens: loop)
            print("Printing Count: \(allElementCount)")
        }
        return allElementCount
    }
func search(childrens: Group) -> Int {
    if childrens.child != nil
    {
        countElements=countElements+(childrens.child?.count)!
        for child in childrens.child! {
        let result = search(childrens: child)
        }
    }
    return countElements
}

}