算法-统计一个视图上所有子视图的个数

《算法-统计一个视图上所有子视图的个数》

从此无心爱良夜
任他明月下西楼

前言

统计一个视图上所有子视图的个数包含子视图的子视图

实现方式

递归

DFS深度优先遍历

队列

BFS广度优先遍历

代码实现

递归

思想:

视图为空的时候返回0
视图没有子视图的时候返回1
视图有子视图的时候:
    当前个数为count=1
    遍历当前视图的所有子视图,再对子视图分别进行递归操作
    NSInteger calculateAllSubviewsWithDFS(UIView *view) {
        if (view == nil) { // 视图为空的时候返回0
            return 0;
        } else if (view.subviews.count == 0) { // 视图没有子视图的时候返回1
            return 1;
        } else {
            NSInteger count = 1;
            for (NSInteger i = 0; i < view.subviews.count; i++) {
                count += calculateAllSubviewsWithDFS(view.subviews[i]);
            }
            return count;
        }
    }

队列

思想:

视图为空的时候返回0
视图没有子视图的时候返回1
视图有子视图的时候:
    当前个数为count=1
    创建队列
    入队列
    当队列不为空的时候
    取出队列中第一个视图,并保存
    计算第一个视图的的子视图个数
    计算后第一个视图在队列中移除
    遍历第一个视图的所有子视图,并且入队列
    
    NSInteger calculateAllSubviewsWithBFS(UIView *view) {
        if (view == nil) { // 视图为空的时候返回0
            return 0;
        } else if (view.subviews.count == 0) { // 视图没有子视图的时候返回1
            return 1;
        } else { // 视图有子视图的时候
            NSInteger count = 1;
            //创建队列
            NSMutableArray *arrayM = [NSMutableArray array];
            //入队列
            [arrayM addObject:view];
            // 当队列不为空的时候
            while (arrayM.count) {
                // 取出队列第一个视图
                UIView *subview = arrayM[0];
                //删除队列第一个视图
                [arrayM removeObject:subview];
                //计算第一个视图的的子视图个数
                count += subview.subviews.count;
                // 遍历第一个视图的所有子视图,并且入队列
                for (NSInteger i = 0; i < subview.subviews.count; i++) {
                    // 入队列
                    [arrayM addObject:subview.subviews[i]];
                }
            }
            return count;
        }
    }
    原文作者:Jieyi
    原文地址: https://segmentfault.com/a/1190000019857679
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞