Objective-C: Foundation——NSSet、NSMutableSet

原创 2016年08月29日 11:26:02

1.NSSet

1.1 集合,是无序、没有重复元素的数组
1.2 创建方法(3种)
1.3 自定义类的对象防止重复时需要写以下方法
—1.3.1 粗滤: -(NSUInteger)hash
—1.3.2 细滤: -(BOOL)isEqual:(id)object;
1.4 判断集合中是否拥有指定的元素
1.5 判断两个集合是否相等
1.6 判断某个集合是否是另一个集合的子集
1.7 将集合转换成数组
1.8 遍历(3种)

建一个Student类
.h文件

#import <Foundation/Foundation.h>

@interface CZStudent : NSObject
@property NSString* name;
@property int age;
-(id)initWithName:(NSString*)name andAge:(int)age;
+(id)studentWithName:(NSString*)name andAge:(int)age;
-(void)show;
@end

.m文件 (在里面重写函数)

#import "CZStudent.h"

@implementation CZStudent
-(id)initWithName:(NSString*)name andAge:(int)age;
{
    self = [super init];
    if (self) {
        self.name=name;
        self.age=age;
    }
    return self;
}
+(id)studentWithName:(NSString *)name andAge:(int)age
{
    __autoreleasing CZStudent *stu=[[CZStudent alloc]initWithName:name andAge:age];
    return stu;
}
-(void)show
{
    NSLog(@"name:%@,age:%d",self.name,self.age);
}
-(NSString *)description
{
    return [NSString stringWithFormat:@"name:%@,age:%d",self.name,self.age ];
}

-(NSUInteger)hash //粗滤
{
    return self.age;    //不进行粗滤 return YES;
}

-(BOOL)isEqual:(id)object  //细滤
{
    if(self==object)
    {
        return YES;  //YES表示重复
    }
    if([object isMemberOfClass:[CZStudent class]])
    {
        CZStudent *s=object;
        if([self.name isEqualToString:s.name]==YES&&self.age==s.age)
        {
            return YES;
        }
    }
    return NO;//NO表示没有重复
}
@end

main函数

#import <Foundation/Foundation.h>
#import "CZStudent.h"
#import "CZTeacher.h"
int main(int argc, const char * argv[]) {
    @autoreleasepool {

        //创建方法
        NSSet *set1=[NSSet setWithObjects:@"one",@"two",@"three",@"two", nil]; //标准创建
        NSLog(@"标准创建:%@",set1);
        NSSet *set2=[NSSet setWithSet:set1];   //副本创建
        NSLog(@"副本创建:%@",set2);
        NSArray *str=@[@"one",@"two",@"three",@"two"];
        NSSet *set3=[NSSet setWithArray:str];//将数组转换成集合
        NSLog(@"数组转换集合:%@",set3);



        //自定义类的对象防止重复,需要在类中重写方法
        CZStudent* s1=[CZStudent studentWithName:@"张三" andAge:18];
        CZStudent* s2=[CZStudent studentWithName:@"李四" andAge:20];
        CZStudent* s3=[CZStudent studentWithName:@"王五" andAge:19];
        CZStudent *s4=[CZStudent studentWithName:@"张三" andAge:18];
        NSSet *set4=[NSSet setWithObjects:s1,s2,s3,s4, nil];
        NSLog(@"自定义类的对象防重复set4:%@",set4);



        //判断集合是否有指定元素
        if([set1 containsObject:@"two"] ==YES)
        {
            NSLog(@"集合set1中包含@\"two@\"");
        }

        //判断两个集合是否相等
        if([set1 isEqualToSet:set2]==YES)
        {
            NSLog(@"set1与set2相等");
        }

        //判断某集合是否为另一个集合的子集
        NSSet *set6=[NSSet setWithObjects:@"one",@"three", nil];
        if([set6 isSubsetOfSet:set1]==YES)
        {
            NSLog(@"set6是set1的子集");
        }


        //将集合转换成数组
        NSArray *array=[set1 allObjects];
        NSLog(@"集合转换数组:%@",array);


        //遍历
        NSArray *array1=[set1 allObjects];
        for(int i=0;i<set1.count;i++)//面向过程遍历需要先将集合转换为数组

        {
            NSLog(@"面向过程遍历:%@",array1[i]);
        }
        NSLog(@"----------");

        for(id obj in set1) //面向对象遍历
        {
            NSLog(@"面向对象遍历:%@",obj);
        }

        NSEnumerator *e=[set1 objectEnumerator]; //枚举器遍历
        while(str =[e nextObject])//nextObject :每循环一次,取一个元素
        {
            NSLog(@"枚举器遍历:%@",str);
        }


    }
    return 0;
}

运行结果

2016-08-29 11:10:30.852 cz_day22_01[1690:86427] 标准创建:{(
    one,
    three,
    two
)}
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 副本创建:{(
    one,
    three,
    two
)}
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 数组转换集合:{(
    one,
    three,
    two
)}

2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 自定义类的对象防重复set4:{(
    name:张三,age:18,
    name:王五,age:19,
    name:李四,age:20
)}

2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 集合set1中包含@"two@"
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] set1与set2相等
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] set6是set1的子集

2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 集合转换数组:(
    one,
    three,
    two
)
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 面向过程遍历:one
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 面向过程遍历:three
2016-08-29 11:10:30.853 cz_day22_01[1690:86427] 面向过程遍历:two

2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 面向对象遍历:one
2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 面向对象遍历:three
2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 面向对象遍历:two

2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 枚举器遍历:one
2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 枚举器遍历:three
2016-08-29 11:10:30.854 cz_day22_01[1690:86427] 枚举器遍历:two
Program ended with exit code: 0

2.NSMutableSet

2.1 是可变集合,是NSSet的子类
2.2 创建方法(3种)
2.3 添加方法
2.4 删除方法
main函数


#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {
    @autoreleasepool {
        //创建方法
        NSMutableSet *set1=[NSMutableSet set]; //空集合,有意义
        NSMutableSet *set2=[NSMutableSet setWithCapacity:100]; //预估值
        NSMutableSet *set3=[NSMutableSet setWithObjects:@"one",@"two",@"three", nil]; //初始化
        NSLog(@"初始化创建:%@",set3);

        //添加元素方法
        [set3 addObject:@"four"];   //,单个添加,会自动过滤
        [set3 addObject:@"four"];
        NSLog(@"添加元素:%@",set3);
        NSArray *array =@[@"five",@"six"];
        [set3 addObjectsFromArray:array];  //批量添加,自动过滤
        NSLog(@"批量添加:%@",set3);

        //删除方法
        [set3 removeObject:@"three"];    //删除指定元素
        NSLog(@"删除指定元素:%@",set3);
        [set3 removeAllObjects];        //清空集合
        NSLog(@"清空集合:%@",set3);

        //交集运算方法
        NSArray *added1=@[@"one",@"two",@"three"];
        [set2 removeAllObjects];
        [set2 addObjectsFromArray:added1];
        NSArray *added2=@[@"one",@"three",@"four"];
        [set3 addObjectsFromArray:added2];
        [set2 intersectSet:set3];   //求交集,交集的结果放回set2;
        NSLog(@"交集set2:%@",set2);

        //并集的运算方法
        [set2 unionSet:set3];
        NSLog(@"并集set2:%@",set2);

        //从一个集合中删除另一个集合的元素
        [set2 removeAllObjects];
        [set2 addObjectsFromArray:added1];

        [set3 removeAllObjects];
        [set3 addObjectsFromArray:added2];

        [set2 minusSet:set3];
        NSLog(@"删除另一个集合的元素:%@",set2);

    }
    return 0;
}

运行结果

2016-08-29 14:53:52.201 cz_day22_03[2654:172099] 初始化创建:{(
    one,
    two,
    three
)}
2016-08-29 14:53:52.202 cz_day22_03[2654:172099] 添加元素:{(
    one,
    three,
    two,
    four
)}
2016-08-29 14:53:52.202 cz_day22_03[2654:172099] 批量添加:{(
    one,
    five,
    three,
    two,
    four,
    six
)}
2016-08-29 14:53:52.202 cz_day22_03[2654:172099] 删除指定元素:{(
    one,
    five,
    two,
    four,
    six
)}
2016-08-29 14:53:52.202 cz_day22_03[2654:172099] 清空集合:{(
)}
2016-08-29 14:53:52.202 cz_day22_03[2654:172099] 交集set2:{(
    one,
    three
)}
2016-08-29 14:53:52.203 cz_day22_03[2654:172099] 并集set2:{(
    one,
    four,
    three
)}
2016-08-29 14:53:52.203 cz_day22_03[2654:172099] 删除另一个集合的元素:{(
    two
)}
Program ended with exit code: 0
版权声明:本文为博主原创文章,未经博主允许不得转载。

Objective-C学习-NSSet(集合),NSMutableSet(可变集合) NSCountSet(计数集合)

NSSet集合对象是用来干什么的呢,在之前做的demo和项目中很少用,但并不是代表不好用,在追求效率方面NSSet要比NSArray要高的多,因为他的查找是通过Hash(哈希)查找,自然会比数组遍历要...
  • RunIntoLove
  • RunIntoLove
  • 2015年11月22日 17:10
  • 1070

NSSet -- 集合&&NSMutableSet -- 可变集合

// // main.m // OC05-task-03 // // Created by Xin the Great on 15-1-25. // Copyright (c) 2015年 X...
  • zuojx1013
  • zuojx1013
  • 2015年01月27日 21:02
  • 1860

NSArray,NSDictionary,NSSet总结

NSArray,NSDictionary,NSSet总结 够全面
  • u010586842
  • u010586842
  • 2014年11月23日 13:02
  • 2034

Foundation NSSet NSMutableSet

------Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ------- // // main.m // NSSet // // Created by Liu...
  • xi_niuniu
  • xi_niuniu
  • 2015年04月19日 11:11
  • 249

OC NSSet、NSMutableSet、NSArray、NSMutableArray

不可变长度的Set @interface NSSet : NSObject   初始化方法 + (instancetype)set; //声明一个空集 + (instancetype)setWithO...
  • jjwwmlp456
  • jjwwmlp456
  • 2015年02月04日 12:50
  • 3671

Objective-C基础—— NSSet & NSMutableSet

一、NSSet 1> NSSet是一组单值对象的不可变集合,集合中元素没有顺序; 2> 操作包括:搜索、添加、删除集合中的元素(仅用于可变集合)、比较两个集合,计算两个集合的交集和并集等。 3> 常用...
  • tian19911217
  • tian19911217
  • 2015年03月15日 20:13
  • 170

iOS 中NSArray NSSet转换 过滤重复与排序操作

很久没写ios代码。最近和朋友聊天时候有强迫症,想强烈把代码给优化。 问题是这样的:现在数据是日期数组,想过滤掉重复的日期,怎么解决。 原始代码 这里想到更简洁点。用NSSet来搞定。 ...
  • watsy
  • watsy
  • 2014年01月02日 13:14
  • 17880

NSSet 集合创建,获取,遍历,可变集合的删除 - iOS

NSSet 集合 NSArray 自然顺序 NSSet是无序的 注意:这个是最为重要的功能 NSSet 中不能够存储重复的数据,可以用它来去除重复的值 NSString * str1 = @"one"...
  • zyq522376829
  • zyq522376829
  • 2016年08月14日 15:17
  • 1986

Objective-C学习之NSSet、NSMutableSet

NSSet到底什么类型,其实它和NSArray功能性质一样,用于存储对象,属于集合; NSSet,NSMutableSet类声明编程接口对象,无序的集合,在内存中存储方式是不连续的,不像NSArray...
  • yxys01
  • yxys01
  • 2016年05月19日 09:18
  • 202

黑马程序员---Foundation常用类之NSSet/NSMutableSet

———Java培训、Android培训、iOS培训、.Net培训、期待与您交流! ——— NSSet和NSArray的对比  1> 共同点  * 都是集合,都能存放多个OC对象  * 只能...
  • zhangyun2013
  • zhangyun2013
  • 2014年10月23日 15:29
  • 229
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Objective-C: Foundation——NSSet、NSMutableSet
举报原因:
原因补充:

(最多只允许输入30个字)