Way*_*hop 4 algorithm objective-c data-structures
尽管Objective-C是C的超集,但我希望得到关于如何使用Objective-C创建trie数据结构的反馈.我已经开始编写接口编码,但需要一些帮助来理解如何添加Trie节点(例如集合项)来存储单词.
@interface Trie : NSMutableArray {
Trie *child;
BOOL final;
}
@property(nonatomic, retain)Trie *child;
@property(nonatomic, assign)BOOL final;
-(void)addWord:(NSString *)_word;
@end
Run Code Online (Sandbox Code Playgroud)
Dim*_*ima 11
我为你写了一个快速的实现,它应该或多或少地起作用,至少它可以作为一个起点.请注意,我摆脱了数组子类.您通常不希望子类化NSArrays,在这里您可以避免一般的子类化.请参阅继承与组合.
@interface Trie : NSObject
@property (nonatomic, strong) NSMutableArray *children;
@property (nonatomic, strong) NSString *key;
@property (nonatomic, readonly) BOOL isFinal;
- (void) addWord:(NSString *)word;
- (id) initWithKey:(NSString *)key;
@end
@implementation Trie
// designated initializer, initializes our array of children and sets the key
- (id) initWithKey:(NSString *)key
{
if(self = [super init])
{
_key = key;
_children = [NSMutableArray new];
}
return self;
}
- (void) addWord:(NSString *)word
{
// no more characters left, this is our base case
if(! word.length)
{
return;
}
Trie *childToUse;
NSString *firstCharacter = [word substringToIndex:1];
// look for an existing node to dive into
for(Trie *child in _children)
{
if([child.key isEqualToString:firstCharacter])
{
childToUse = child;
break;
}
}
// create a new node if there isn't one
if(! childToUse)
{
childToUse = [[Trie alloc] initWithKey:firstCharacter];
[_children addObject:childToUse];
}
// we now have a node, add the rest of the word into our trie recursively
[childToUse addWord:[word substringFromIndex:1]];
}
// no actual ivar is stored for this property, its value is returned dynamically by looking at the array count, which can change when more elements are added
- (BOOL) isFinal
{
if(! _children.count)
{
return YES;
}
else
{
return NO;
}
}
@end
Run Code Online (Sandbox Code Playgroud)
只需通过执行类似操作来初始化根节点[[Trie alloc] initWithKey:@""].