1. 程式人生 > >集合:NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSSet、NSMutableSet使用

集合:NSArray、NSMutableArray、NSDictionary、NSMutableDictionary、NSSet、NSMutableSet使用

    /*本文介紹了:NSArray(有序的集合,儲存的元素在一個整塊的記憶體中並按序排列)、
     NSMutableArray、
     NSDictionary(鍵值對映)、
     NSMutableDictionary、
     NSSet(無序的集合,雜湊儲存)、
     NSMutableSet, 類方法參見官方API*/
    
    //一、陣列 NSArray
    // 1‘建立陣列
    NSArray *array = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];
    
    //2、-(unsigned) count陣列所包含物件個數
    NSLog(@"self.dataArray cound:%lu", [array count]);
    
    //3、- (id) objectAtIndex: (unsigned int) index;獲取指定索引處的物件;
    NSLog(@"self.dataArray cound 2:%@",[array objectAtIndex:2]);
    
    //切分陣列
    //4、從字串分割到陣列- componentsSeparatedByString:
    NSString *string = [[NSString alloc] initWithString:@"One,Two,Three,Four"];
    NSLog(@"string:%@",string);
    NSArray *array = [string componentsSeparatedByString:@","];
    NSLog(@"array:%@",array);
    [string release];
    
    //5、從數組合並元素到字串- componentsJoinedByString:
    NSArray *array = [[NSArray alloc] initWithObjects:@"One",@"Two",@"Three",@"Four",nil];
    NSString *string = [array componentsJoinedByString:@","];
    NSLog(@"string:%@",string);
    
    //二、從一個數組拷貝資料到另一陣列(可變數級)NSMutableArray
    //1、arrayWithArray:
    NSArray *array2 = [NSArray arrayWithObjects:@"a",@"b",@"c",nil];
    NSLog(@"array:%@",array2);
    
    NSMutableArray *mutableArray = [[NSMutableArray alloc] init];
    mutableArray = [NSMutableArray arrayWithArray:array2];
    NSLog(@"MutableArray:%@",mutableArray);
    
    NSArray *array1 = [[NSArray alloc] init];
    array1 = [NSArray arrayWithArray:array2];
    NSLog(@"array1:%@",array1);
    
    //2、Copy
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    NSArray *oldArray = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];
    NSLog(@"oldArray:%@",oldArray);
    
    id obj;
    for(int i = 0; i < [oldArray count]; i++)
    {
        obj = [[oldArray objectAtIndex:i] copy];
        [newArray addObject: obj];
    }
    NSLog(@"newArray:%@", newArray);
    [newArray release];
    
    //3、快速列舉
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    NSArray *oldArray2 = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];
    NSLog(@"oldArray:%@", oldArray2);
    
    for(id obj in oldArray2)
    {
        [newArray addObject: obj];
    }
    NSLog(@"newArray:%@", newArray);
    [newArray release];
    
    //4、Deep copy
    NSArray *oldArray = [NSArray arrayWithObjects:@"a",@"b",@"c",@"d",@"e",@"f",@"g",@"h",nil];
    NSLog(@"oldArray:%@",oldArray);
    
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    newArray = (NSMutableArray*)CFPropertyListCreateDeepCopy(kCFAllocatorDefault,  (CFPropertyListRef)oldArray, kCFPropertyListMutableContainers);
    NSLog(@"newArray:%@", newArray);
    [newArray release];
    
    //5、Copy and sort
    NSArray *oldArray = [NSArray arrayWithObjects:@"b",@"a",@"e",@"d",@"c",@"f",@"h",@"g",nil];
    NSLog(@"oldArray:%@",oldArray);
    
    NSMutableArray *newArray = [[NSMutableArray alloc] init];
    NSEnumerator *enumerator = [oldArray objectEnumerator];
    id obj;
    while(obj = [enumerator nextObject])
    {
        [newArray addObject: obj];
    }
    [newArray sortUsingSelector:@selector(compare:)];
    NSLog(@"newArray:%@", newArray);
    [newArray release];
    
    //6、給陣列分配容量
    NSArray *array = [NSMutableArray arrayWithCapacity:20];
    
    //7、在陣列末尾新增物件,- (void) addObject: (id) anObject;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    [array addObject:@"Four"];
    NSLog(@"array:%@",array);
    
    //8、刪除陣列中指定索引處物件,-(void) removeObjectAtIndex: (unsigned) index;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    [array removeObjectAtIndex:1];
    NSLog(@"array:%@",array);
    
    //9、陣列列舉,- (NSEnumerator *)objectEnumerator;從前向後
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    NSEnumerator *enumerator = [array objectEnumerator];
    id thingie;
    while (thingie = [enumerator nextObject]) {
        NSLog(@"thingie:%@",thingie);
    }
    
    //10、從後向前,-(NSEnumerator *)reverseObjectEnumerator;
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    NSEnumerator *enumerator = [array reverseObjectEnumerator];
    id object;
    while (object = [enumerator nextObject]) {
        NSLog(@"object:%@",object);
    }
    
    //11、快速列舉
    NSMutableArray *array = [NSMutableArray arrayWithObjects:@"One",@"Two",@"Three",nil];
    for(NSString *string in array)
    {
        NSLog(@"string:%@",string);
    }
    
    //三、字典 NSDictionary,key/value 方式,對應於Java中Map
    //1、建立字典,- (id) initWithObjectsAndKeys;
    NSDictionary *dictionary = [[NSDictionary alloc] initWithObjectsAndKeys:@"One",@"1",@"Two",@"2",@"Three",@"3",nil];
    NSString *string = [dictionary objectForKey:@"One"];
    NSLog(@"string:%@",string);
    NSLog(@"dictionary:%@",dictionary);
    [dictionary release];
    
    //四、可變字典 NSMutableDictionary
    //1、建立可變字典
    NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];
    [dictionary setObject:@"One" forKey:@"1"];
    [dictionary setObject:@"Two" forKey:@"2"];
    [dictionary setObject:@"Three" forKey:@"3"];
    [dictionary setObject:@"Four" forKey:@"4"];
    NSLog(@"dictionary:%@",dictionary);
    
    //2、刪除指定的字典
    [dictionary removeObjectForKey:@"3"];
    NSLog(@"dictionary:%@",dictionary);
    
    //3、對任何物件進行包裝NSValue, 將NSRect放入NSArray中,將NSRect放入NSArray中
    NSMutableArray *array = [[NSMutableArray alloc] init];
    CGRect rect = CGRectMake(0, 0, 320, 480);
    NSValue *value = [NSValue valueWithBytes:&rect objCType:@encode(CGRect)];
    [array addObject:value];
    NSLog(@"array:%@",array);
    
    //4、從Array中提取
    value = [array objectAtIndex:0];
    [value getValue:&rect];
    NSLog(@"value:%@",value);
    
    //5、從目錄搜尋副檔名為jpg的檔案
    NSString *home = @"../Users/";
    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSDirectoryEnumerator *direnum = [fileManager enumeratorAtPath: home];
    NSMutableArray *files = [[NSMutableArray alloc] init];
    
    NSString *filename;
    while (filename = [direnum nextObject]) {
        if([[filename pathExtension] hasSuffix:@"jpg"]){
            [files addObject:filename];
        }
    }
    
    //快速列舉
    for(NSString *filename in direnum){
        if([[filename pathExtension] isEqualToString:@"jpg"]){
            [files addObject:filename];
        }
    }
    NSLog(@"files:%@",files);
    
    //6、列舉
    NSEnumerator *filenum = [files objectEnumerator];
    while (filename = [filenum nextObject]) {
        NSLog(@"filename:%@",filename);
    }
    
    //快速列舉
    for(id object in files){
        NSLog(@"object:%@",object);
    }
    
    //五、NSSet
    //1、NSSet的使用
    /*
     [NSSet setWithSet:(NSSet *)set]; 用另外一個set物件構造
     [NSSet setWithArray:(NSArray *)array];用陣列構造
     [NSSet setWithObjects:...]:建立集合物件,並且初始化集合中的數值,結尾必需使用nil標誌。
     [set count] ; 得到這個結合物件的長度。
     [set containsObject:...]: 判斷這個集合中是否存在傳入的物件,返回Bool值。
     [set objectEnumerator]: 將集合放入迭代器。
     [enumerator nextObject]:得到迭代器中的下一個節點資料,使用while遍歷這個迭代器,方可遍歷集合物件中的物件。
     [set isEqualToSet:objset]:判斷兩個集合是否完全相等,返回Bool值。
     [set isSubsetOfSet:objset]:判斷集合中的所有資料是否都相等與objeset集合中,返回Bool值。
     [set allObjects];
     */
    NSSet *set = [NSSet setWithObjects:@"25",@"age",@"張三",@"name",@"男",nil];
    NSSet *set1 = [NSSet setWithObjects:@"25",@"age",@"張三",@"name",@"男",@"性別",nil];
    NSLog(@"set count:%lu", [set count]);
    
    //判斷是否含有age字串
    if([set containsObject:@"age"]) {
        NSLog(@"set包含age");
    }
    
    //判斷set 是否等於set1
    if ([set isEqualToSet:set1]) {
        NSLog(@"set 等於 set1");
    }
    
    //判斷set是否是否是set1的子集合
    if ([set isSubsetOfSet:set1]) {
        NSLog(@"set isSubsetOfSet set1");
    }
    
    //獲取所有set物件
    NSArray *array = [set allObjects];
    NSLog(@"array:%@", array);
    
    //迭代遍歷
    NSEnumerator *enumerator = [set objectEnumerator];
    for (NSObject *object in enumerator) {
        NSLog(@"set1裡的物件:%@", object);
    }
    
    //六、NSMutableSet的使用
    /*
     NSMutableSet繼承NSSet,它可以使用NSSet的方法。
     [NSMutableSet setWithCapacity:6]:建立可變集合物件,並且初始化長度為6。
     [set addObject: obj] : 向集合中動態的新增物件。
     [set removeObject:obj]:刪除集合中的一個物件。
     [set removeAllObjects]:刪除集合中的所有物件。
     [set unionSet:obj]:向集合中新增一個obj集合的所有資料。
     [set minusSet:obj]:向集合中刪除一個obj集合的所有資料。
     [set intersectSet]:向集合中刪除一個不包含obj集合的所有資料。
     */
    //集合NSMutableSet中不能存在重複的物件
    NSMutableSet *set1 = [[NSMutableSet alloc] initWithObjects:@"1",@"2",@"3", nil];
    NSMutableSet *set2 = [[NSMutableSet alloc] initWithObjects:@"1",@"5",@"6", nil];
    [set1 unionSet:set2];      //取並集1,2,3,5,6
    [set1 intersectSet:set2];  //取交集1
    [set1 minusSet:set2];      //取差集2,3,5,6