集合对象

作者:追风剑情 发布于:2019-3-2 11:59 分类:Objective-C

NSSet、NSMutableSet、NSIndexSet、NSCountedSet、NSOrderedSet、NSMutableOrderedSet类。

NSSet是不可变集合。NSSet上拥有的操作包括:比较两个集合、计算两个集合的交集和并集等。

NSMutableSet是可变集合,是NSSet的子类。NSMutableSet上拥有的操作包括:搜索添加删除、比较两个集合、计算两个集合的交集和并集等。

NSCountedSet用来维护对象计数。

NSIndexSet用来存储一组有序的索引,没有可变版本。

NSOrderedSet和NSMutableOrderedSet是用来处理有序、不重复集合(类似于数组)的。

常用的NSSet方法
方法 描述
+(instancetype) setWithObjects: obj1, obj2,...,nil 使用一列对象创建新集合
-(id) anyObject 返回集合中任一对象
-(instancetype) initWithObjects: obj1,obj2,...,nil 使用一列对象初始新分配的集合
-(NSUInteger) count 返回集合的成员个数
-(BOOL) containsObject: obj 确定集合是否包含obj
-(BOOL) member: obj 使用isEqual:方法确定集合是否包含obj
-(NSEnumerator *) objectEnumerator 为集合中的所有对象返回一个NSEnumerator对象
-(BOOL) isSubsetOfSet: nsset 确定接收者的每个成员是否都出现在nsset中
-(BOOL) intersectsSet: nsset 确定接收者中是否至少有一个成员出现在对象nsset中
-(BOOL) isEqualToSet: nsset 确定两个集合是否相等

常用的NSMutableSet方法
方法 描述
-(void) addObject: obj 将对象obj添加到集合中
-(void) removeObject: obj 从集合中删除对象obj
-(void) removeAllObjects 删除接受者的所有成员
-(void) unionSet: nsset 将对象nsset的所有成员添加到接收者
-(void) minusSet: nsset 从接收者中删除nsset的所有成员
-(void) intersectSet: nsset 将接收者中所有不属于nsset的元素删除

常用的NSIndexSet方法
方法 描述
+(instancetype) indexSet 创建一个空的索引集合
-(BOOL) containIndex: idx 如果索引集合包含索引idx,则返回YES,否则返回NO
-(NSUInteger) count 返回索引集合中索引的数量
-(NSUInteger) firstIndex 返回集合中的第一个索引,如果集合为空,则返回NSNotFound
-(NSUInteger) indexLessThanIndex: idx 返回集合中小于idx的最接近的索引,如果没有小于idx的索引,则返回NSNotFound,类似indexLessThanOrEqualToIndex:、indexGreaterThanIndex和indexGreaterThanOrEqualIndex:
-(NSUInteger) lastIndex 返回集合的最后一个索引,如果集合为空,则返回NSNotFound
-(NSIndexSet *) indexesPassingTest: (BOOL) (^)(NSUInteger idx, BOOL *stop) block 区块应用在集合中的每一个元素。idx添加到了NSIndexSet中返回YES,否则返回NO;设置指针变量stop为YES,表示中断处理

示例

#import <Foundation/Foundation.h>
#import "Printing.h"

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        NSMutableSet *set1 = [NSMutableSet setWithObjects:
                              @1, @3, @5, @10, nil];
        NSSet *set2 = [NSSet setWithObjects:
                       @-5, @100, @3, @5, nil];
        NSSet *set3 = [NSSet setWithObjects:
                       @12, @200, @3, nil];
        
        NSLog(@"set1: ");
        [set1 print];
        NSLog(@"set2: ");
        [set2 print];
        
        // 相等性测试
        if ([set1 isEqualToSet: set2] == YES)
            NSLog(@"set1 equals set2");
        else
            NSLog(@"set1 is not equal to set2");
        
        // 成员测试
        if ([set1 containsObject: @10] == YES)
            NSLog(@"set1 contains 10");
        else
            NSLog(@"set1 does not contain 10");
        
        if ([set2 containsObject: @10] == YES)
            NSLog(@"set2 contains 10");
        else
            NSLog(@"set2 does not contain 10");
        
        // 在可变集合set1中添加和移除对象
        [set1 addObject: @4];
        [set1 removeObject: @10];
        NSLog(@"set1 after adding 4 and removing 10: ");
        [set1 print];
        
        // 获得两个集合的交集
        [set1 intersectSet: set2];
        NSLog(@"set1 intersect set2: ");
        [set1 print];
        
        // 两个集合的并集
        [set1 unionSet: set3];
        NSLog(@"set1 union set3: ");
        [set1 print];
        
        // NSCountedSet用来记录集合中相同对象个数
        NSCountedSet *countSet = [[NSCountedSet alloc] init];
        NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
        
        [countSet addObject: set1];
        [countSet addObject: set1];
        [countSet addObject: set1];
        
        NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
        
        [countSet removeObject: set1];
        NSLog(@"set1 count: %li", (long)[countSet countForObject: set1]);
    }
    return 0;
}

运行测试
111.png

示例二:NSIndexSet
AddressBook.h、AddressBook.m 参见 示例:制作地址薄
添加一个查询方法

-(NSIndexSet *) lookupAll: (NSString *) theName
{
    NSIndexSet *result = [book indexesOfObjectsPassingTest:
        ^(id obj, NSUInteger idx, BOOL *stop)
        {
            if ([[obj name] caseInsensitiveCompare: theName] == NSOrderedSame)
                return YES;
            else
                return NO;
        }];
    return result;
}



标签: Objective-C

Powered by emlog  蜀ICP备18021003号-1   sitemap

川公网安备 51019002001593号