首先我们需要一个全国省市区的文本文件area.txt
创建类 TreeNode
#import <Foundation/Foundation.h>
@interface TreeNode : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *subnodes;
@property (nonatomic, assign) TreeNode *superNode;
- (id)initWithNode:(NSString *)name;
+ (id)treeWithNode: (NSString *)name;
- (TreeNode *)getSubnodeWithNode:(NSString *)node;
- (TreeNode *)getAnynodeWithNode:(NSString *)node;
+ (void)traverseAllNode:(TreeNode *)root;
- (NSString *)getFullName;
@end
@interface TreeNode : NSObject
@property (nonatomic, retain) NSString *name;
@property (nonatomic, retain) NSMutableArray *subnodes;
@property (nonatomic, assign) TreeNode *superNode;
- (id)initWithNode:(NSString *)name;
+ (id)treeWithNode: (NSString *)name;
- (TreeNode *)getSubnodeWithNode:(NSString *)node;
- (TreeNode *)getAnynodeWithNode:(NSString *)node;
+ (void)traverseAllNode:(TreeNode *)root;
- (NSString *)getFullName;
@end
方法实现:
#import "TreeNode.h"
@implementation TreeNode
- (id)initWithNode:(NSString *)name{
self = [super init];
if (self) {
[self setName:name];
[self setSubnodes:[NSMutableArray array]];
}
return self;
}
+ (id)treeWithNode: (NSString *)name{
TreeNode *node = [[TreeNode alloc]initWithNode:name];
return node;
}
- (TreeNode *)getSubnodeWithNode:(NSString *)node{
TreeNode *snode = nil;
for (TreeNode *nd in self.subnodes) {
if ([nd.name isEqualToString:node]) {
snode = nd;
}
}
return snode;
}
- (TreeNode *)getAnynodeWithNode:(NSString *)node{
TreeNode *snode = nil;
if ([self.name isEqualToString:node]) {
snode = self;
}else{
for (TreeNode *nd in self.subnodes) {
snode = [nd getAnynodeWithNode:node];
if (snode != nil) {
break;
}
}
}
return snode;
}
+ (void)traverseAllNode:(TreeNode *)root{
NSLog(@"%@", root.name);
for (TreeNode *nd in root.subnodes) {
[TreeNode traverseAllNode:nd];
}
}
- (NSString *)getFullName{
NSMutableString *s = [NSMutableString string];
TreeNode *n = self;
while (n) {
[s insertString:n.name atIndex:0];
n = [n superNode];
}
return s;
}
@end
@implementation TreeNode
- (id)initWithNode:(NSString *)name{
self = [super init];
if (self) {
[self setName:name];
[self setSubnodes:[NSMutableArray array]];
}
return self;
}
+ (id)treeWithNode: (NSString *)name{
TreeNode *node = [[TreeNode alloc]initWithNode:name];
return node;
}
- (TreeNode *)getSubnodeWithNode:(NSString *)node{
TreeNode *snode = nil;
for (TreeNode *nd in self.subnodes) {
if ([nd.name isEqualToString:node]) {
snode = nd;
}
}
return snode;
}
- (TreeNode *)getAnynodeWithNode:(NSString *)node{
TreeNode *snode = nil;
if ([self.name isEqualToString:node]) {
snode = self;
}else{
for (TreeNode *nd in self.subnodes) {
snode = [nd getAnynodeWithNode:node];
if (snode != nil) {
break;
}
}
}
return snode;
}
+ (void)traverseAllNode:(TreeNode *)root{
NSLog(@"%@", root.name);
for (TreeNode *nd in root.subnodes) {
[TreeNode traverseAllNode:nd];
}
}
- (NSString *)getFullName{
NSMutableString *s = [NSMutableString string];
TreeNode *n = self;
while (n) {
[s insertString:n.name atIndex:0];
n = [n superNode];
}
return s;
}
@end
main.m
#import <Foundation/Foundation.h>
#import "TreeNode.h"
int main(int argc, const char * argv[]) {
NSString *filePath = @"/Users/dllo/Desktop/OC/HomeWork/HomeWork-TreeNode/HomeWork-TreeNode/area.txt";
NSString *buffer = [NSString stringWithContentsOfFile:filePath encoding:NSUTF8StringEncoding error:nil];
NSArray *array = [buffer componentsSeparatedByString:@"\n"];
NSCharacterSet *cSet = [NSCharacterSet characterSetWithCharactersInString:@" 0123456789"];
TreeNode *root = [TreeNode treeWithNode:@"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 treeWithNode:nodeName];
[parentNode.subnodes addObject:childNode];
[childNode setSuperNode:parentNode];
}
TreeNode *node = [root getAnynodeWithNode:@"鼓楼区"];
NSLog(@"%@", [node getFullName]);