OC处理树杈型数据

Objective-C处理形如下面的数据

北京 1
  北京市 1
    西城区 1
    东城区 2
    崇文区 3
    宣武区 4
    朝阳区 5
    丰台区 6
    石景山区 7
    海淀区 8
    门头沟区 9
    房山区 10
    通州区 11
    顺义区 12
    昌平区 13
    大兴区 14
    怀柔区 15
    平谷区 16
    密云区 17
    延庆区 18
天津 2
  天津市 2
    和平区 19
    河东区 20
    河西区 21
    南开区 22
    河北区 23
    红桥区 24
    塘沽区 25
    汉沽区 26
    大港区 27
    东丽区 28
    西青区 29
    津南区 30
    北辰区 31
    武清区 32
    宝坻区 33
    宁河县 34
    静海县 35
    蓟县 36

具体思路:通过数据前空格的不同,处理数据。

NSString *filePath = @"/Users/dlios/Desktop/homework/demo_oc_11/demo_oc_11/area.txt";//提取txt文件路径
    
    NSString *buffer = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];//将文件数据转换成字符串
    NSArray *array = [buffer componentsSeparatedByString:@"\n"];//通过换行将数据分离成一个个字符串,放入数组
    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString:@" 0123456789"];//创建一个字符集

数据初始处理后,创建一个节点的类TreeNode

属性包括:*name节点名,*subNodes子节点,*superNode父节点

创建方法:

1、通过名字找到相对应的子节点。

- (TreeNode *)getSubnodeWithName:(NSString *)name
{
    TreeNode *node = nil;
    for (TreeNode *snode in self.subnodes) {
        if ([[node name] isEqualToString:name]) {
            node = snode;
            break;
        }
    }
    return node;
}

2、通过名字找到该节点的所有节点
- (TreeNode *)getAnyNodeWithName:(NSString *)name
{
    TreeNode *node = nil;
    if ([[self name] isEqualToString:name]) {
        node = self;
    }else{
        for (TreeNode *snode in self.subnodes) {
            node = [snode getAnyNodeWithName:name];
            if (node != nil) {
                break;
            }
        }
    }
    return node;
}

3、打印节点的所有子节点的名字
+ (void)traverseAllNode:(TreeNode *)root
{
    NSLog(@"%@", root.name);
    for (TreeNode *node in root.subnodes) {
        [self traverseAllNode:node];
    }
}

4、得到节点下的所有子节点的名字
- (NSString *)getFullName
{
    NSMutableString *string = [NSMutableString string];
    TreeNode *node = self;
    while (node) {
        [string insertString:[node name] atIndex:0];
        node = [node superNode];
    }
    return string;
}


主函数中数据的具体实现:

TreeNode *root = [TreeNode treeNodeWithName:@"china"];
    
    for (NSString *s in array) {
        //找的父节点
        TreeNode *parentNode = root;
        NSRange r = NSMakeRange(0, 2);
        NSString *s1 = [s substringWithRange:r];
        while ([s1 isEqualToString:@"  "]) {
            parentNode = [parentNode.subnodes lastObject];
            r.location += 2;
            s1 = [s substringWithRange:r];
        }
        //创建子节点
        NSString *nodeName = [s stringByTrimmingCharactersInSet:cSet];
        TreeNode *childNode = [TreeNode treeNodeWithName:nodeName];
        [parentNode.subnodes addObject:childNode];
        [childNode setSuperNode:parentNode];
    }


将数据封装好,即可使用节点名字找到对应的节点

如:

TreeNode *node = [root getAnyNodeWithName:@"河东区"];
    NSLog(@"%@", [node getFullName]);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值