//
// 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