哈希表代码说明

时间:2014-05-18 03:21:31

标签: ios objective-c hashtable

我发现这个用objective-c编写的哈希表的实现。我几乎可以遵循所有这些,但我很难理解 - (id)init函数究竟是如何工作的。这是HashTable.m文件中有3行的方法(我在问题后面重新编写了它)。有人可以解释它到底在做什么吗?我包括了一些其他相关的代码,虽然在大多数情况下我认为我可以遵循其余的。尽管我不清楚init方法的细节。感谢

-(id)init
{
    self =[super init];
    self.othercontainer = [[NSMutableArray alloc]init];
    return self;

}

HashTable.h

#import <Foundation/Foundation.h>

@interface HashTable : NSObject

@property(nonatomic) NSMutableArray* othercontainer;

-(id)objectForKey:(NSString*)name;
-(void)setObject:(id)object forKey:(NSString*)name;
-(id)init;


@end

HashTable.m

#import "HashTable.h"
#import "Person.h"

@implementation HashTable

-(id)init
{
    self =[super init];
    self.othercontainer = [[NSMutableArray alloc]init];
    return self;
}

-(id)objectForKey:(NSString*)name
{
    Person* tempPerson = nil;
    for (id item in self.othercontainer)
    {
        NSString* tempName = [((Person*)item) name];
        if ([tempName isEqualToString:name])
        {
            tempPerson = item;
            break;
        }

    }


    return tempPerson;
}

-(void)setObject:(id)object forKey:(NSString*)name
{
    [self.othercontainer addObject:object];
}

@end

ViewController.m的一部分

NSData *data;
NSFileHandle *fh;
NSString *inBoundFile = @"/Users/user/Desktop/names.txt";
NSString *fileString;

    fh = [NSFileHandle fileHandleForReadingAtPath:inBoundFile];

    data = [fh readDataToEndOfFile];
    fileString = [[NSString alloc]initWithData:data encoding:NSUTF8StringEncoding];

    NSArray *PersonArray = [fileString componentsSeparatedByString:@"\n"];

    self.container = [[HashTable alloc]init];
    for (int x= 0; PersonArray.count > x ;x++) {
        NSArray* tempNameandAddress = [PersonArray[x] componentsSeparatedByString:@" "];
        Person *personA = [[Person alloc]init]; //could be other ways of defining an instance of an object
        personA.name = tempNameandAddress[0];
        personA.address = tempNameandAddress[1];
        if ([self.container objectForKey:personA.name] == nil)
            [self.container setObject:personA forKey:personA.name];
        else
            NSLog(@"%@ already exists \n",personA.name);
    }

1 个答案:

答案 0 :(得分:2)

这只是一个几乎正确的公共init。 self设置为超类init返回的对象。 然后他们错过了一个合适的步骤 下一步应该是if (self) { ...additional setup... } 基本上只有创建ivars /属性,如果从super init返回的self不是nil。 如果self在那时是零,你通常会绕过额外的代码并直接返回self。 (返回无)

下一行是为othercontainer属性创建NSMutableArray ivar。

这也不太对。 在init中,这是您应该直接使用合成的ivar。 _othercontainer = [[NSMutableArray alloc] init];

这里没什么特别的。