Посещение дочерних узлов всех элементов массива - PullRequest
0 голосов
/ 11 сентября 2018

У меня есть массив объектов со следующим объектом. Он содержит дочернее свойство, которое фактически является другим массивом объектов с таким же типом, и эта структура продолжается. Что я действительно хочу сейчас, так это то, что я хочу посетить все дочерние элементы для всех элементов в массиве.

  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 голосов
/ 11 сентября 2018

Для дерева вам нужна рекурсивная функция, которая вызывает сама себя.

Я рекомендую объявить 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)
0 голосов
/ 11 сентября 2018

Вот как я решаю это с помощью рекурсии

  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
}

}

0 голосов
/ 11 сентября 2018

Вот метод для подсчета всех дочерних и дочерних дочерних элементов на основе вашей 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 }
...