省市

//

//  TreeNode.h

//  省市

//

//  Created by dlios on 15/2/4.

//  Copyright (c) 2015 dllo. All rights reserved.

//


#import <Foundation/Foundation.h>


@interface TreeNode : NSObject


@property(nonatomic, retain) NSString *name;

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

@property(nonatomic, assign) TreeNode *superNode;

//父对象在其生命周期可以强引子对象, 而子对象绝对不可以强引父对象(造成两个对象无法释放)(所以使用assign


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

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


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

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


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

- (NSString *)getFullName;


@end






#import "TreeNode.h"


@implementation TreeNode


- (void)dealloc

{

    [_name release];

    [_subnodes release];      //[_superNode release]不可以写

                              //父对象在其生命周期可以强引子对象, 而子对象绝对不可以强引父对象(造成两个对象无法释放)

    [super dealloc];

}



- (id)initWithName:(NSString *)name

{

    self = [super init];

    if (self) {

        [self setName:name];

        [self setSubnodes:[NSMutableArray array]];

        [self setSuperNode:nil];

    }

    return self;

}



+ (id)treeNodeWithName:(NSString *)name

{

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

    return [node autorelease];

}



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

{

    TreeNode *node = nil;

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

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

            node = nd;

            break;

        }

    }

    return node;

}



+ (void)traverseAllNodes:(TreeNode *)root

{

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

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

        [self traverseAllNodes:node];    //类中的self代表类对象的首地址

        //同上:[TreeNode treeNodeWithName:node];

    }

}



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

{

    TreeNode *node = nil;

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

        node = self;

    } else {

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

//            if ([[snode name] isEqualToString:name]) {

//                node = snode;

//                break;

//            } else {

                node = [snode getAnyNodeWithName:name];

                if (node != nil) {

                    break;

                }

            //}

        }

    }

    

    return node;

}


- (NSString *)getFullName

{

    NSMutableString *fullName = [NSMutableString string];

    TreeNode *node = self;

    while (node) {

        [fullName insertString:[node name] atIndex:0];

        node = [node superNode];

    }

    return fullName;

}


@end




#import <Foundation/Foundation.h>

#import "TreeNode.h"


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

 

    NSString *filePath = @"/Users/dllo/Desktop/省市/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) {

        //找到父结点

        TreeNode *parentNode = root;

        NSRange r = NSMakeRange(0, 2);

        NSString *s1 = [s substringWithRange:r];

        while ([s1 isEqualTo:@"  "]) {

            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]);

    



@end


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值