oc地图

本文介绍了一个使用Objective-C实现的树形结构数据模型。通过创建TreeNode类来构建多层次的树状结构,并提供了查找特定节点的方法。此外,还展示了如何从文本文件中读取数据并构建这种树形结构。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

.h文件

#import <Foundation/Foundation.h>


@interface TreeNode : NSObject

@property (nonatomic, retain)NSString *name;

@property (nonatomic, retain)NSMutableArray *subnodes; //子节点

//父对象会强引用子对象,子对象不能强引用父对象(子对象强引用父对象会造成:循环引用会造成内存空洞)

//父对象在生命周期内会对子对象引用计数器+1,如果子对象强引用父对象会造成父对象引用计数器+1,彼此释放时都持有最后一次造成内存空洞

@property (nonatomic, assign)TreeNode *superNode;      //父节点


- (id)initWithName:(NSString *)name;

+ (id)treeNodeWithName:(NSString *)name;


- (TreeNode *)getSubnodeWithName:(NSString *)name;


- (TreeNode *)getAnyNodeWithName:(NSString *)name;

//遍历所有节点

+ (void)traverseAllNode:(TreeNode *)root;

@end

.m文件

#import "TreeNode.h"


@implementation TreeNode

- (void)dealloc

{

    [_name release];

    [_subnodes release];

    

    [super dealloc];

}


- (id)initWithName:(NSString *)name

{

    self = [super init];

    if (self) {

        [self setName:name];

        [self setSubnodes:[NSMutableArray array]];

    }

    return self;

}

+ (id)treeNodeWithName:(NSString *)name

{

    TreeNode *node = [[TreeNode alloc]initWithName:name];

    return [node autorelease];

}


- (TreeNode *)getSubnodeWithName:(NSString *)name

{

    TreeNode *node = nil;

    for (TreeNode *tn in [self subnodes]) {

        if ([[tn name]isEqualToString:name]) {

            node = tn;

            break;

        }

    }

    return node;

}

- (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;

}

//树形结构的遍历就是递归

+ (void)traverseAllNode:(TreeNode *)root

{

    NSLog(@"%@", [root name]);

    for (TreeNode *node in [root subnodes]) {

        //类方法中self代表类对象

        [self traverseAllNode:node];

        [TreeNode traverseAllNode:node];

    }

}

.m文件

#import <Foundation/Foundation.h>

#import "TreeNode.h"

int main(int argc, const char * argv[]) {

    

    NSString *filePath = @"/Users/dlios/Desktop/666666/20150302/20150302/area.txt";

    NSString *buffer = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];

    NSArray *array = [buffer componentsSeparatedByString:@"\n"];

    NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString:@" 0123456789"];

    

    TreeNode *root = [TreeNode treeNodeWithName:@"root"];

    

    

    

    //创建子节点

    //找到父节点

    for (NSString *s in array) {

        if (! [s hasPrefix:@" "]) {

            NSString *provinceName = [s stringByTrimmingCharactersInSet:cSet];

            TreeNode *pNode = [TreeNode treeNodeWithName:provinceName];

            [root.subnodes addObject:pNode];

            

            

        }

        if ([s hasPrefix:@"  "] && ! [s hasPrefix:@"   "]) {

            TreeNode *pNode = [root.subnodes lastObject];

            NSString *cityName = [s stringByTrimmingCharactersInSet:cSet];

            TreeNode *cNode = [TreeNode treeNodeWithName:cityName];

            [pNode.subnodes addObject:cNode];

            

            

        }

        if ([s hasPrefix:@"    "]) {

            TreeNode *pNode = [root.subnodes lastObject];

            TreeNode *cNode = [pNode.subnodes lastObject];

            

            NSString *districtName = [s stringByTrimmingCharactersInSet:cSet];

            TreeNode *dNode = [TreeNode treeNodeWithName:districtName];

            [cNode.subnodes addObject:dNode];

        }

    }

    

    

    for (TreeNode *pNode in [root subnodes]) {

        if ([[pNode name] isEqualToString:@"黑龙江"]) {

            for (TreeNode *cNode in [pNode subnodes]) {

                if ([[cNode name] isEqualToString:@"齐齐哈尔市"]) {

                    for (TreeNode *dNode in [cNode subnodes]) {

                        NSLog(@"%@", [dNode name]);

                    }

                }

            }

        }

    }

    return 0;

}


输出部分

2015-03-02 10:09:45.782 20150302[1500:303] 龙沙区

2015-03-02 10:09:45.802 20150302[1500:303] 建华区

2015-03-02 10:09:45.802 20150302[1500:303] 铁锋区

2015-03-02 10:09:45.803 20150302[1500:303] 昂昂溪区

2015-03-02 10:09:45.803 20150302[1500:303] 富拉尔基区

2015-03-02 10:09:45.804 20150302[1500:303] 碾子山区

2015-03-02 10:09:45.804 20150302[1500:303] 梅里斯区

2015-03-02 10:09:45.805 20150302[1500:303] 讷河市

2015-03-02 10:09:45.805 20150302[1500:303] 龙江县

2015-03-02 10:09:45.806 20150302[1500:303] 依安县

2015-03-02 10:09:45.806 20150302[1500:303] 泰来县

2015-03-02 10:09:45.806 20150302[1500:303] 甘南县

2015-03-02 10:09:45.807 20150302[1500:303] 富裕县

2015-03-02 10:09:45.807 20150302[1500:303] 克山县

2015-03-02 10:09:45.808 20150302[1500:303] 克东县

2015-03-02 10:09:45.808 20150302[1500:303] 拜泉县

Program ended with exit code: 0



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值