zoukankan      html  css  js  c++  java
  • iOS

    前言

    • NSSet:集合

      	@interface NSSet<__covariant ObjectType> : NSObject <NSCopying, NSMutableCopying, NSSecureCoding, NSFastEnumeration>
      	@interface NSMutableSet<ObjectType> : NSSet<ObjectType>
      
      • NSSet 集合跟数组差不多,但 Set 集合不能存放相同的对象,它是一组单值对象的集合,被存放进集合中的数据是无序的,它可以是可变的,也可以是不变的。

      • Xcode 7 对系统中常用的一系列容器类型都增加了泛型支持(),有了泛型后就可以指定容器类中对象的类型了。假如向泛型容器中加入错误的对象,编译器会报警告。

        	__covariant:协变性,子类型可以强转到父类型(里氏替换原则)。
         	__contravariant:逆变性,父类型可以强转到子类型。
        
      • 不指定泛型类型的对象可以和任意泛型类型转化,但指定了泛型类型后,两个不同类型间是不可以强转的,假如你希望主动控制转化关系,就需要使用泛型的协变性和逆变性修饰符。

    • NSCountedSet:计数集合

      	@interface NSCountedSet<ObjectType> : NSMutableSet<ObjectType>
      
      • NSCountedSet 这种集合中同一对象可以出现多次,然而并非在集合中存放多次这个对象,而是维护一个次数计数。当第一次将对象添加到集合中时,对象的 count 值被置为 1,然后每次将这个对象添加到集合中, count 值就会增加 1,每次从集合中删除对象,count 值就会减 1。当对象的 count 值为零时,实际上对象本身就被删除了。
    • NSIndexSet:索引集合

      	@interface NSIndexSet : NSObject <NSCopying, NSMutableCopying, NSSecureCoding>
      	@interface NSMutableIndexSet : NSIndexSet
      
      • NSIndexSet 这种集合用于存储有序的索引到某种数据结构,比如数组。

    1、不可变集合 NSSet 的创建

    	// 对象方法创建
    		
    		NSSet *set1 = [[NSSet alloc] init];
    		    
    		// 与 set1 的地址相同
    		NSSet *set2 = [[NSSet alloc] initWithSet:set1];
    		
    		NSSet *set3 = [[NSSet alloc] initWithObjects:@55, @23, @3, @8, nil];
    		NSSet *set4 = [[NSSet alloc] initWithArray:@[@55, @23, @3, @8, @21, @33, @18]];
    		    
    	// 类方法创建
    		
    		NSSet *set5 = [NSSet set];
    		    
    		// 与 set1 的地址相同
    		NSSet *set6 = [NSSet setWithSet:set1];
    	
    		NSSet *set7 = [NSSet setWithObject:@8];
    		NSSet *set8 = [NSSet setWithObjects:@55, @23, @3, @8, nil];
    		NSSet *set9 = [NSSet setWithArray:@[@55, @23, @3, @8, @21, @33, @18]];
    		    
    	// 已有对象创建
    		
    		NSSet *set10 = [set1 setByAddingObject:@8];
    		NSSet *set11 = [set1 setByAddingObjectsFromSet:set9];
    		NSSet *set12 = [set1 setByAddingObjectsFromArray:@[@55, @23, @3, @8, @21, @33, @18]];
    	    
    	// 泛型方法
    	
    		NSSet<NSNumber *> *set13 = [NSSet setWithObjects:@55, @23, @3, @8, nil];
    

    2、集合成员个数的计算

    	NSSet *set = [NSSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	    
    	NSUInteger length = [set count];
    

    3、集合元素的获取

    	NSSet *set = [NSSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	    
    	// 获取集合中的任意元素
    	id anyObject = [set anyObject];
    

    4、判断集合中是否包含某个元素

    	NSSet *set = [NSSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	    
    	// containsObject
    		    
    		// 判断是否包含某个元素,包含返回 1, 不包含返回 0
    		BOOL containsObject = [set containsObject:@3];
    	  	
    	// member
    	    
    		// 判断是否包含某个元素,包含返回元素值, 不包含返回 null
    		id member = [set member:@8];
    

    5、集合的比较

    	NSSet *set1 = [NSSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	NSSet *set2 = [NSSet setWithObjects:@5, @23, @3, @8, @22, @33, @81, nil];
    	    
    	// isEqualToSet
    	    
    		// 判断两个集合是否相等
    		BOOL isEqualToSet = [set1 isEqualToSet:set2];
    		  	
    	// isSubsetOfSet
    		    
    		// 判断一个集合是否为另一个集合的子集
    		BOOL isSubsetOfSet = [set1 isSubsetOfSet:set2];
    	  	
    	// intersectsSet
    	    
    		// 判断一个集合和另一个集合是否有交集
    		BOOL intersectsSet = [set1 intersectsSet:set2];
    

    6、可变集合 NSSet 的创建

    	// 对象方法创建
    	NSMutableSet *set1 = [[NSMutableSet alloc] initWithCapacity:0];
    	    
    	// 类方法创建
    	NSMutableSet *set2 = [NSMutableSet setWithCapacity:0];
    

    7、集合元素的添加

    	NSMutableSet *set = [NSMutableSet setWithCapacity:0];
    	    
    	// addObject
    	[set addObject:@8];
    		
    	// addObjectsFromArray
    	[set addObjectsFromArray:@[@5, @23, @3, @21]];
    

    8、集合元素的删除

    	NSMutableSet *set = [NSMutableSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
    	    
    	// removeObject
    		    
    		// 删除指定元素
    		[set removeObject:@8];
    			
    	// minusSet
    	    
    		// 删除指定集合中有的所有元素,当前集合中删除与指定集合的交集
    		NSSet *set1 = [NSSet setWithObjects:@23, @18, @33, nil];
    		[set minusSet:set1];
    		
    	// removeAllObjects
    	    
    		// 删除所有元素
    		[set removeAllObjects];
    

    9、集合元素的修改

    	NSMutableSet *set = [NSMutableSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
    	    
    	// 覆盖所有元素
    	[set setSet:[NSSet setWithObjects:@2, @3, nil]];
    

    10、取两个集合的交集

    	NSMutableSet *set = [NSMutableSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	NSMutableSet *set1 = [NSMutableSet setWithObjects:@5, @23, @3, @8, @22, @33, @81, nil];
    	    
    	// 交集保存到接收集合中
    	[set intersectSet:set1];
    

    11、取两个集合的并集

    	NSMutableSet *set = [NSMutableSet setWithObjects:@55, @23, @3, @8, @21, @33, @18, nil];
    	NSMutableSet *set1 = [NSMutableSet setWithObjects:@5, @23, @3, @8, @22, @33, @81, nil];
    	    
    	// 并集保存到接收集合中
    	[set unionSet:set1];
    

    12、集合的条件遍历

    • 用 Block 遍历

      	NSSet *set = [NSSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
      	    
      	[set enumerateObjectsUsingBlock:^(id  _Nonnull obj, BOOL * _Nonnull stop) { 
      		NSLog(@"%@", obj);
      	}];
      
    • 用 迭代 遍历

      	NSSet *set = [NSSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
      	    
      	NSEnumerator *enu = [set objectEnumerator];
      	    
      	id obj = nil;
      	while (obj = [enu nextObject]) {
      		NSLog(@"%@", obj);
      	}
      
    • 条件遍历

      	NSSet *set = [NSSet setWithObjects:@5, @23, @3, @8, @21, @33, @18, nil];
      	    
      	// 遍历集合,取出所有满足条件(能返回 YES)的值
      	NSSet *set1 = [set objectsPassingTest:^BOOL(id  _Nonnull obj, BOOL * _Nonnull stop) {
      	    
      		return [obj intValue] > 10 ? : NO;
      	}];	
      

    13、计数集合 NSCountedSet 的创建

    	NSCountedSet *countedSet1 = [[NSCountedSet alloc] init];
    	NSCountedSet *countedSet2 = [[NSCountedSet alloc] initWithSet:countedSet1];
    	NSCountedSet *countedSet3 = [[NSCountedSet alloc] initWithCapacity:0];
    	NSCountedSet *countedSet4 = [[NSCountedSet alloc] initWithArray:@[@5, @23, @3, @8, @22, @33, @81]];
    	    
    	// 输出时每个元素后面的中括号中显示该元素值在集合中的个数
    	NSLog(@"%@", countedSet4);
    

    14、计数集合元素的添加

    	NSCountedSet *set = [NSCountedSet setWithObjects:@2, @3, @4, nil];
    	    
    	// 向集合中多次添加同一个元素,该元素的计数值增加
    	[set addObject:@4];
    	[set addObject:@4];
    	[set addObject:@4];
    

    15、计数集合元素的删除

    	NSCountedSet *set = [NSCountedSet setWithObjects:@2, @3, @4, nil];
    	[set addObject:@4];
    			
    	// 从集合中删除元素,该元素的计数值减小
    	[set removeObject:@4];
    

    16、计数集合计数值的计算

    	NSCountedSet *set = [NSCountedSet setWithObjects:@2, @3, @4, nil];
    	[set addObject:@4];
    	[set addObject:@4];
    	[set addObject:@4]; 
    	    
    	// 检索集合中某个元素的计数值
    	NSUInteger countForObject = [set countForObject:@4];
    

    17、索引集合 NSIndexSet 的创建

    	// 对象方法创建
    	    
    		// 创建一个空的索引集合
    		NSIndexSet *indexSet1 = [[NSIndexSet alloc] init];
    		    
    		// 与 indexSet1 的地址不同
    		NSIndexSet *indexSet2 = [[NSIndexSet alloc] initWithIndexSet:indexSet1];
    		
    		// 创建有 1 个元素的索引集合,元素为 8
    		NSIndexSet *indexSet3 = [[NSIndexSet alloc] initWithIndex:8];
    		
    		// 创建有 5 个元素的索引集合,元素为 2,3,4,5,6
    		NSIndexSet *indexSet4 = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(2, 5)];
    		    
    	// 类方法创建
    		    
    		// 创建一个空的索引集合
    		NSIndexSet *indexSet5 = [NSIndexSet indexSet];
    		
    		// 创建有 1 个元素的索引集合,元素为 5
    		NSIndexSet *indexSet6 = [NSIndexSet indexSetWithIndex:5];
    		
    		// 创建有 8 个元素的索引集合
    		NSIndexSet *indexSet7 = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 8)];
    

    18、索引集合元素数量的计算

    	NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 8)];
    	    
    	// 计算索引集合所有索引的数量
    	NSUInteger length1 = [indexSet count];
    	
    	// 计算索引集合中某一范围内的索引的数量
    	NSUInteger length2 = [indexSet countOfIndexesInRange:NSMakeRange(5, 5)];
    

    19、索引集合元素的获取

    	NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 8)];
    	   
    	// firstIndex
    		    
    		// 获取索引集合中的第一个索引,如果集合为空则返回 NSNotFound
    		NSUInteger result1 = [indexSet firstIndex];
    			
    	// lastIndex
    	    
    		// 获取索引集合的最后一个索引,如果集合为空则返回 NSNotFound
    		NSUInteger result2 = [indexSet lastIndex];
    		
    	// indexLessThanIndex
    	    
    		// 获取索引集合中小于指定的索引且最接近的索引,如果没有小于的索引则返回 NSNotFound
    		NSUInteger result3 = [indexSet indexLessThanIndex:3];
    		
    	// indexLessThanOrEqualToIndex
    	    
    		// 获取索引集合中小于等于指定的索引且最接近的索引,如果没有小于的索引则返回 NSNotFound
    		NSUInteger result4 = [indexSet indexLessThanOrEqualToIndex:3];
    		
    	// indexGreaterThanIndex
    	    
    		// 获取索引集合中大于指定的索引且最接近的索引,如果没有大于的索引则返回 NSNotFound
    		NSUInteger result5 = [indexSet indexGreaterThanIndex:10];
    		
    	// indexGreaterThanIndex
    		    
    		// 获取索引集合中大于等于指定的索引且最接近的索引,如果没有大于的索引则返回 NSNotFound
    		NSUInteger result6 = [indexSet indexGreaterThanOrEqualToIndex:10];
    

    20、判断索引集合中是否包含某元素

    	NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 5)];
    	    
    	// containsIndex
    	    
    		// 判断索引集合中是否包含某个索引
    		NSLog(@"%zi", [indexSet containsIndex:7]);
    	    
    	// containsIndexes
    	    
    		// 判断一个索引集合中是否包含另一个索引集合
    		NSIndexSet *indexSet1 = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(4, 2)];
    		NSLog(@"%zi", [indexSet containsIndexes:indexSet1]);
    	    
    	// containsIndexesInRange
    	    
    		// 判断一个索引集合中是否包含某一个范围内的所有值(是否是其父集)
    		NSLog(@"%zi", [indexSet containsIndexesInRange:NSMakeRange(4, 3)]);
    	    
    	// intersectsIndexesInRange
    	    
    		// 判断一个索引集合中是否包含某一个范围内的值(是否有交集)
    		NSLog(@"%zi", [indexSet intersectsIndexesInRange:NSMakeRange(4, 3)]);
    

    21、索引集合元素的比较

    	NSIndexSet *indexSet1 = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 5)];
    	NSIndexSet *indexSet2 = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 4)];
    	    
    	BOOL isEqual = [indexSet1 isEqualToIndexSet:indexSet2];
    

    22、可变索引集合元素的添加

    	NSMutableIndexSet *mIndexSet = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 5)];
    	  	
    	// addIndex
    	    
    		// 添加一个索引元素,集合中已存在时会合并
    		[mIndexSet addIndex:7];
    	   	
    	// addIndexes
    	    
    		// 添加一个索引集合,两个索引集合有交集时会合并
    		NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(9, 5)];
    		[mIndexSet addIndexes:indexSet];
    	   	
    	// addIndexesInRange
    	    
    		// 添加一个范围内的元素,有交集时会合并
    		[mIndexSet addIndexesInRange:NSMakeRange(15, 3)];
    

    23、可变索引集合元素的删除

    	NSMutableIndexSet *mIndexSet = [NSMutableIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 10)];
    		
    	// removeIndex
    		    
    		// 删除一个索引集合中的索引元素
    		[mIndexSet removeIndex:5];
    		
    	// removeIndexes
    	    
    		// 删除指定集合中含有的索引元素
    		NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(7, 3)];
    		[mIndexSet removeIndexes:indexSet];
    		
    	// removeIndexesInRange
    		    
    		// 删除指定范围内含有的索引元素
    		[mIndexSet removeIndexesInRange:NSMakeRange(2, 2)];
    		
    	// removeAllIndexes
    	    
    		// 删除全部索引元素
    		[mIndexSet removeAllIndexes];
    

    24、索引集合的遍历

    • 用 Block 遍历

      	NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 10)];
      	    
      	// enumerateIndexesUsingBlock
      	
      		// 遍历获取索引集合的所有索引值
      		[indexSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {        				
      			NSLog(@"%zi", idx);
      		}];
      	    
      	// enumerateRangesUsingBlock
      	
      		// 遍历获取索引集合的起始值和索引元素数量
      		[indexSet enumerateRangesUsingBlock:^(NSRange range, BOOL * _Nonnull stop) {          				
      			NSLog(@"%lu   %lu", range.location, range.length);
      		}];
      
    • 条件遍历

      	NSIndexSet *indexSet = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(3, 10)];
      	    
      	// indexesPassingTest
      	
      	NSIndexSet *indexSet1 = [indexSet indexesPassingTest:^BOOL(NSUInteger idx, BOOL * _Nonnull stop) {
      	    
      		// 遍历索引集合,找出索引中所有大于 10 的索引
      		return idx > 10 ? : NO;
      	}];
      	    
      	[indexSet1 enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL * _Nonnull stop) {
      		NSLog(@"%zi", idx);
      	}];
      	    
      	// indexPassingTest
      	
      	NSUInteger index = [indexSet indexPassingTest:^BOOL(NSUInteger idx, BOOL * _Nonnull stop) {
      	    
      		// 遍历索引集合,找出索引中第一个大于 10 的索引
      		return idx > 10 ? : NO;
      	}];
      	    
      	NSLog(@"%zi", index);
      
  • 相关阅读:
    POJ 1328 Radar Installation
    POJ 1700 Crossing River
    POJ 1700 Crossing River
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3253 Fence Repair (贪心,优先队列)
    poj 3069 Saruman's Army(贪心)
    poj 3069 Saruman's Army(贪心)
    Redis 笔记与总结2 String 类型和 Hash 类型
    数据分析方法有哪些_数据分析方法
    数据分析方法有哪些_数据分析方法
  • 原文地址:https://www.cnblogs.com/QianChia/p/5782709.html
Copyright © 2011-2022 走看看