NSIndexSet
類代表一個(gè)不可變的獨(dú)特的無符號(hào)整數(shù)的集合,稱為索引,因?yàn)槭褂盟鼈兊姆绞健_@個(gè)集合被稱為索引集絮爷。你不應(yīng)該使用索引集存儲(chǔ)任意集合的整數(shù)值,因?yàn)樗饕此饕判蚍秶姆绞酱鎯?chǔ)的冤馏。這使得它們更有效率比存儲(chǔ)單個(gè)整數(shù)的集合涡匀。這也意味著每個(gè)索引值指數(shù)中只能出現(xiàn)一次目胡。通俗點(diǎn)講NSIndexSet
就是一個(gè)唯一的脓规,有序的,無符號(hào)整數(shù)
的集合饿幅。
NSMutableIndexSet 是一個(gè)可變的集合,其使用方法如:
NSMutableIndexSet *idxSet = [[NSMutableIndexSet alloc] init];
[idxSet addIndex:5];
[idxSet addIndex:2];
[idxSet addIndex:8];
[idxSet addIndex:12];
// 添加 4到13的索引值
[idxSet addIndexesInRange:NSMakeRange(4, 10)];
[idxSet enumerateIndexesUsingBlock:^(NSUInteger idx, BOOL*stop)
{
NSLog(@"%lu", (unsigned long)idx);
}];
打印結(jié)果:
**2013-11-29 11:34:52.328 Tabels[862:a0b] 2**
**2013-11-29 11:34:52.328 Tables[862:a0b] 4**
**2013-11-29 11:34:52.328 Tables[862:a0b] 5**
**2013-11-29 11:34:52.329 Tables[862:a0b] 6**
**2013-11-29 11:34:52.329 Tables[862:a0b] 7**
**2013-11-29 11:34:52.330 Tables[862:a0b] 8**
**2013-11-29 11:34:52.330 Tables[862:a0b] 9**
**2013-11-29 11:34:52.330 Tables[862:a0b] 10**
**2013-11-29 11:34:52.331 Tables[862:a0b] 11**
**2013-11-29 11:34:52.331 Tables[862:a0b] 12**
**2013-11-29 11:34:52.332 Tables[862:a0b] 13**
****
NSIndexSet 同時(shí)還包含許多方法判斷是否包含某區(qū)間或者從一個(gè)索引值內(nèi)獲取臨近的區(qū)間內(nèi)的索引戒职。如下代碼:
NSUInteger a = [idxSet indexGreaterThanIndex:5];
NSUInteger b = [idxSet indexLessThanIndex:5];
NSUInteger c = [idxSet indexGreaterThanOrEqualToIndex:5];
NSUInteger d = [idxSet indexLessThanOrEqualToIndex:5];
NSLog(@"a = %lu, b = %lu, c = %lu, d = %lu", (unsigned long)a,(unsigned long)b,(unsigned long)c,(unsigned long)d);
結(jié)果:
2013-11-29 15:42:23.053 Tables[1165:a0b] a = 6, b = 4, c = 5, d = 5
NSIndexSet 還取一個(gè) NSRange 范圍中的交集栗恩,然后還可以以相反的順序進(jìn)行枚舉。
這個(gè)需求需要使用NSIndexSet
的enumerateIndexesInRange:options:usingBlock:
方法洪燥,如下代碼
[idxSet enumerateIndexesInRange:NSMakeRange(4, 4)options:NSEnumerationReverse usingBlock:^(NSUInteger idx, BOOL*stop) {
NSLog(@"%lu", (unsigned long)idx);
}]
結(jié)果是:
**2013-11-29 15:49:38.413 Tables[1187:a0b] 7**
**2013-11-29 15:49:38.414 Tables[1187:a0b] 6**
**2013-11-29 15:49:38.414 Tables[1187:a0b] 5**
**2013-11-29 15:49:38.415 Tables[1187:a0b] 4**
由于idxSet
的本身的區(qū)間是2磕秤,4 -13,NSMakeRange(4, 4)
的區(qū)間是4 - 7捧韵,取交集就是4-7市咆,然后反序就是7,6再来,5蒙兰,4.
通過NSIndexSet獲取數(shù)組
NSMutableIndexSet *idxSet1 = [[NSMutableIndexSet alloc] init];
[idxSet1 addIndex:1];
[idxSet1 addIndexesInRange:NSMakeRange(3, 3)];
[idxSet1 addIndexesInRange:NSMakeRange(7, 2)];
NSArray *array =@[@"0",@"1",@"2",@"3",@"4",@"5",@"6",@"7",@"8",@"9"];
NSArray *result = [array objectsAtIndexes:idxSet1];
[result enumerateObjectsUsingBlock:^(id obj, NSUInteger idx,BOOL *stop) {
NSLog(@"%@",obj);
}];
結(jié)果是:
**2013-11-29 15:59:03.961 Tables[1209:a0b] 1**
**2013-11-29 15:59:03.961 Tables[1209:a0b] 3**
**2013-11-29 15:59:03.961 Tables[1209:a0b] 4**
**2013-11-29 15:59:03.962 Tables[1209:a0b] 5**
**2013-11-29 15:59:03.962 Tables[1209:a0b] 7**
**2013-11-29 15:59:03.963 Tables[1209:a0b] 8**