iOS objective-c之-8:數組NSArray 可變數組-(NSMutableArray) – iPhone手機開發技術文章 iPhone軟體開發教學課程

鑌哥自己瞭一些數組方法,網上又查瞭些方法出來,應該是比較全面的。

下面的例子以

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"jonery",@"stany", nil];
1、獲取數組中總共有多少個對象。
– (NSUInteger)count;
NSLog(@"%d",[array count]);
2、獲取數組中下標對應的元素對象.(下標是從0開始)
– (id)objectAtIndex:(NSUInteger)index;

3、在當前數據中追加一個新的對象,並且返回一個新的數據對象(新的數組對象和被追加的對象,是兩個不同的數組對象)。
– (NSArray *)arrayByAddingObject:(id)anObject;

4、在當前的數組中追加一個新的數據,並且返回一個新的數組對象。

– (NSArray *)arrayByAddingObjectsFromArray:(NSArray *)otherArray;

5、使用當前的數組生成一個字符串,新生成的字符串使用提供的separator 字符進行分割。
– (NSString *)componentsJoinedByString:(NSString *)separator;
[array compontsJoinedByString:@","];
運行結果: wendy,andy,tom,jonery,stany
6、檢測數據中是否包含指定的對象元素
– (BOOL)containsObject:(id)anObject;
[array containsObject:@"tom"]; YES
7、使用當前的數組生成字符串。可以重寫description 改變生成的字符串。相當於java 中的toString 方法。
– (NSString *)description;
運行結果
(
wendy,
andy,
tom,
jonery,
stany
)
8、根據設置的locale 進行連接數組
– (NSString *)descriptionWithLocale:(id)locale;

– (NSString *)descriptionWithLocale:(id)locale indent:(NSUInteger)level;

9、兩個數組的第一個元素是否相同,如果相同,則返回 數組中,第一個元素的字符串,反之,返回null 對象
– (id)firstObjectCommonWithArray:(NSArray *)otherArray;
10、 從數組中獲取 NSRange 對象的數據存放到objects 中,NSRange 的數據標示從location,開始後面length 個數據
– (void)getObjects:(id__unsafe_unretained [])objects range:(NSRange)range;

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"jonery",@"stany",@"張山名稱",@"asdta", nil];

NSRange range = NSMakeRange(1, 5);

id *objects;

objects = malloc(sizeof(id) * range.length);

[array getObjects:objects range:range];

for(int i = 0; i < range.length; i++){
NSLog(@"%@",objects[i]);
}

free(objects);

運行的結果

andy
tom
jonery
stany
11、 判斷制定的anObject 對象是否存在數組中如果存在返回,對象所在的下標
– (NSUInteger)indexOfObject:(id)anObject;
如果不存在,返回的NSUInteger 與 NSNotFund 相同
NSUIndex index = [array indexOfObject:@"stan"];
if(index == NSNotFound)
{
對象不在數組中
}

11-1、 判斷制定的元素,是否在數組中,數組查詢的位置,是從range.location 的位置開始,到range.length 的長度結束。
– (NSUInteger)indexOfObject:(id)anObject inRange:(NSRange)range;
如果數據存在,返回指定的下標,如果不存在,則返回NSNotFund 。
實質是使用isEqual 進行比較

12、
同上面兩個方法一項,測試指定的對象是否在數組中不同的是,這裡使用指針進行比較
– (NSUInteger)indexOfObjectIdenticalTo:(id)anObject;
如果數據存在,返回指定的下標,如果不存在,則返回NSNotFund 。
– (NSUInteger)indexOfObjectIdenticalTo:(id)anObject inRange:(NSRange)range;

13、比較兩個數組是否相同 ,數組長度相同,並且相同位置上的元素也相同。
– (BOOL)isEqualToArray:(NSArray *)otherArray;
14、返回最有一個元素,如果一個數組的長度為0 返回的對象為nil
– (id)lastObject;
15、使用數組返回一個 NSEnumerator 對象,這個對象類似與一個指針,可以用來遍歷 整個數組 指針從前向後遍歷
– (NSEnumerator *)objectEnumerator;
示例如下
NSEnumerator *enu = [array objectEnumerator];

id *obj;
while (obj = enu.nextObject) {
NSLog(@"obj===%@==",obj);
}
16、 返回一個NSEnumerator 對象,這個對象類似一個指針,可以用來遍歷真個數據,所不同的是,這個指針,是從後向前遍歷。
– (NSEnumerator *)reverseObjectEnumerator;
17、生成一個NSData 的對象,主要是用來進行數組的排序。 在下面的方法中使用這個對象
– (NSData *)sortedArrayHint;
18、 進行數組的排序
– (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id,id, void *))comparator context:(void *)context;
這個方法類似蘋果實現瞭一個簡單的 排序方法。但是實現的規則需要自己進行處理。
類似的方法如下。 首先提供一個 普通的排序算法,函數和c 的方法類似
NSInteger sortType(id st,id str,void *cha)
{
NSString *s1 = (NSString *)st;
NSString *s2 = (NSString *)str;

if(s1.length > s2.length)
{
return NSOrderedAscending;
}else if(s1.length < s2.length)
{
return NSOrderedDescending;
}

return NSOrderedSame;
}

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil];

NSArray *a = [array sortedArrayUsingFunction:sortType context:nil];

NSLog(@"a=%@",a);
NSArray 為需要排序的數組,返回一個排序完成的數組,再執行osrtedArrayUseingFunction 方法時會,會自動調用上面的sortType 方法,並且,可以按照你
的需要調整上面的規則

19、和上面的方法類似,也是蘋果用來進行排序的。所不同的是,需要傳入一個NSData 的數據。
– (NSArray *)sortedArrayUsingFunction:(NSInteger (*)(id,id, void *))comparator context:(void *)context hint:(NSData *)hint;

NSData *dat = [array sortedArrayHint];
NSArray *a = [array sortedArrayUsingFunction:sortType context:nil hint:dat];

NSLog(@"a=%@",a);
20、 – (NSArray *)sortedArrayUsingSelector:(SEL)comparator;
這是用來排序的函數,comparator 這個參數,需要傳入一個返回結果是NSComparisonResult 的函數,
主要的函數,類似的函數如下:
– (NSComparisonResult)compare:(NSString *)string;
– (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask;
– (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange;
– (NSComparisonResult)compare:(NSString *)string options:(NSStringCompareOptions)mask range:(NSRange)compareRange locale:(id)locale;
– (NSComparisonResult)caseInsensitiveCompare:(NSString *)string;
– (NSComparisonResult)localizedCompare:(NSString *)string;
– (NSComparisonResult)localizedCaseInsensitiveCompare:(NSString *)string;
都可以進行調用
以 localizedCompare: 函數為例進行調用

NSArray *arr = [[NSArray alloc] initWithObjects:@"test", @"abc", @"xyz", nil];
NSLog(@"Befor sort:%@", arr);
SEL sel = @selector(localizedCompare:);
arr = [arr sortedArrayUsingSelector:sel];
NSLog(@"After sort:%@", arr);
得到的結果是:
abc,
test,
xyz

21、用來獲取數組中range.location 開始,數據各數 為range.length 的數據,並放置到一個新的數組中
以數組 為例
NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil];
– (NSArray *)subarrayWithRange:(NSRange)range;
如:
NSArray *test = [array subarrayWithRange:NSMakeRange(2, 2)];
tom,
test
註意range 的數值不要越界。
22、寫入數組中的數據,到指定path 的目錄中:
參數:atomically 是否把文件保存到輔助文件中
– (BOOL)writeToFile:(NSString *)path atomically:(BOOL)useAuxiliaryFile;

23、如同上面的方法一樣,所不同的是寫入數組中的內容到 網上指定的路徑。
– (BOOL)writeToURL:(NSURL *)url atomically:(BOOL)atomically;

24、這個方法的實現類似於,數組中的元素,都是類對象,aselector 是這些類中的無參方法。
– (void)makeObjectsPerformSelector:(SEL)aSelector;
調用例子如下:
首先新建一個ObjectTest 的類,在其中實現一個 無參數方法 – (void)tttttt
在這個方法的實現中可以打印一些日志
– (void)tttttt
{
NSLog(@"==========asasdfasdfasdfas===========");
}

NSArray *array = [NSArray arrayWithObjects:[[[ObjectTest alloc] init] autorelease],[[[ObjectTest alloc] init] autorelease], nil];

調用格式如下,
[array makeObjectsPerformSelector:@selector(tttttt)];

這時就可以看到打印的日志信息瞭。
25、這個方法的調用和上面一個方法類似,所不同的是這個對象調用的方法是一個可以帶參數的方法。參數的類型是id ,也就是可以是任意的類型。
– (void)makeObjectsPerformSelector:(SEL)aSelector withObject:(id)argument;

26、 用來根據indexes 獲取一個數組, NSIndexSet 是一個用來管理 index 的對象。
– (NSArray *)objectsAtIndexes:(NSIndexSet *)indexes;

例子如下:
NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil];

//NSIndexSet *se = [NSIndexSet indexSetWithIndex:0];
或者是
NSIndexSet *se = [NSIndexSet indexSetWithIndexesInRange:NSMakeRange(2, 2)];

NSArray *test = [array objectsAtIndexes:se];
NSLog(@"%@",test);

27、返回指定下標的一個對象。這個方法類似 objectAtIndex:
– (id)objectAtIndexedSubscript:(NSUInteger)idx

28、使用block 塊遍歷整個數組。這個block 需要三個參數,id obj 表示數組中的元素。
NSUInteger idx 標示元素的下標,
bool *stop 是一個bool類型的參數。 官方描述如下:
A reference to a Boolean value. The block can set the value to YES to stop further processing of the array.
The stop argument is an out-only argument. You should only ever set this Boolean to YES within the Block.
– (void)enumerateObjectsUsingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block
調用例子如:

NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil];

[array enumerateObjectsUsingBlock:^(id str,NSUInteger index, BOOL* te){
NSLog(@"%@,%d",str,index);
}];
29、同上面的方法一項,區別在於,這裡多添加瞭一個參數,用來標示 是從前向後遍歷,還是從後往前遍歷。
– (void)enumerateObjectsWithOptions:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block
調用例子如下:
NSArray *array = [NSArray arrayWithObjects:@"wendy",@"andy",@"tom",@"test", nil];

[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){
NSLog(@"%@,%d",str,index);
}];
30、 同上面的方法一項,不過NSIndexSet 參數標示,根據下標取出的數組,這裡真正在block 中遍歷的數組,是根據NSindexSet 取到的子數組
– (void)enumerateObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts usingBlock:(void (^)(id obj, NSUInteger idx,BOOL *stop))block
調用如下:
[array enumerateObjectsAtIndexes:[NSIndexSet indexSetWithIndexesInRange:NSMakeRange(1, 3)] options:NSEnumerationReverse usingBlock:^(id str,NSUInteger index, BOOL* te){
NSLog(@"%@,%d",str,index);
}];
31、 根據條件用來獲取一個NSUIndex 對象,主要是根據條件進行數據遍歷使用
– (NSUInteger)indexOfObjectPassingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate

調用如下:
NSInteger index = [array indexOfObjectPassingTest:^ BOOL (id tr,NSUInteger index, BOOL *te){
NSString *s = (NSString *)tr;
if([@"wendy" isEqualToString:s])
{
return YES;
}
return NO;
}];

NSLog(@"index==%d=.",index);
32、同上面的方法相同,卻別在於,這裡添加瞭一個參數,用來表示遍歷是從前向後遍歷還是從後遍歷。
– (NSUInteger)indexOfObjectWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate

33、這個添加瞭參數NSIntexSet 參數,用來獲取子數組,然後使用這個子數組進行遍歷,處理數據
– (NSUInteger)indexOfObjectAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate

31、 根據block 的處理獲取一個NSIndexSet 對象。
– (NSIndexSet *)indexesOfObjectsPassingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate
調用如下:
NSIndexSet *index = [array indexesOfObjectsPassingTest: ^ BOOL (id tr, NSUInteger index,BOOL *te){

NSString *s = (NSString *)tr;
if([s isEqualToString:@"andy"]){
return YES;
}
return NO;
}];

NSLog(@"%@",index);
33 、 這個方法添加瞭參數,用來表示,是從前向後,遍歷還是從後向前遍歷
– (NSIndexSet *)indexesOfObjectsWithOptions:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate NS_AVAILABLE(10_6,4_0);

調用示例如下:
NSIndexSet *index = [array indexesOfObjectsWithOptions:NSEnumerationReverse passingTest: ^ BOOL (id tr, NSUInteger index,BOOL *te){

NSString *s = (NSString *)tr;
if([s isEqualToString:@"andy"]){
return YES;
}
return NO;
}];

NSLog(@"%@",index);

34、 添加參數NSIndexSet 用來獲取子數組,使用子數組進行遍歷
– (NSIndexSet *)indexesOfObjectsAtIndexes:(NSIndexSet *)s options:(NSEnumerationOptions)opts passingTest:(BOOL (^)(id obj, NSUInteger idx,BOOL *stop))predicate

35、對數組進行排序操作 參數cmptr 是一個block 函數塊,返回的數據類型是一個NSComparisonResult 對象
– (NSArray *)sortedArrayUsingComparator:(NSComparator)cmptr

調用例子如下:
NSArray *te = [array sortedArrayUsingComparator:^ NSComparisonResult (NSString *s,NSString *s2){
if(s.length < s2.length){
return NSOrderedAscending;
}
if(s.length > s2.length){
return NSOrderedDescending;
}

return NSOrderedSame;
}];

NSLog(@"te=%@.",te);
36、進行排序操作,NSSortOptions 排序的參數 用來表示是同時排序,還是穩定執行。
– (NSArray *)sortedArrayWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr NS_AVAILABLE(10_6,4_0);

NSArray *test = [array sortedArrayWithOptions:NSSortStable usingComparator:^ NSComparisonResult (NSString *s,NSString *s2){

if(s.length < s2.length){
return NSOrderedAscending;
}
if(s.length > s2.length){
return NSOrderedDescending;
}

return NSOrderedSame;
}];

NSLog(@"%@",test); NSArray 數組的創建
1、使用類方法創建 一個空的數組
+ (id)array;

2、使用類方法創建 隻有一個對象的數組
+ (id)arrayWithObject:(id)anObject;

3、從 c 數組創建一個 NSarray 數以cnt 不能超出數組的范圍。不然會有數據越界的異常
+ (id)arrayWithObjects:(const id [])objects count:(NSUInteger)cnt;

id objects[10] = {@"abbb",@"bczdfasdf",@"casdfasdf",@"asdfasdf"};

NSArray *array = [NSArray arrayWithObjects:objects count:2];

NSLog(@"%@",array);

4、 使用後面的元素,創建一個數組
+ (id)arrayWithObjects:(id)firstObj, … NS_REQUIRES_NIL_TERMINATION;

5、array 創建一個新的數組
+ (id)arrayWithArray:(NSArray *)array;

6、使用 c 數組 創建一個數組。
– (id)initWithObjects:(const id [])objects count:(NSUInteger)cnt;

7、使用objects 創建數組
– (id)initWithObjects:(id)firstObj, … NS_REQUIRES_NIL_TERMINATION;

8、使用一個array 創建一個數組
– (id)initWithArray:(NSArray *)array;

9、使用array 創建一個數組,後面的標識是 是否拷貝原來的元素
flag 如果是YES, 數組中每個元素,將引用copywithzone。
– (id)initWithArray:(NSArray *)array copyItems:(BOOL)flag;

10、讀取文件創建一個數組,
+ (id)arrayWithContentsOfFile:(NSString *)path;

11、使用URL 穿件一個數組,這個URL可以是本地的文件路徑,也可是是網絡上的內容
+ (id)arrayWithContentsOfURL:(NSURL *)url;

12、讀取文件創建一個數組,
– (id)initWithContentsOfFile:(NSString *)path;

13、使用URL 穿件一個數組,這個URL可以是本地的文件路徑,也可是是網絡上的內容
– (id)initWithContentsOfURL:(NSURL *)url; 1、 向數組中添加一個對象
– (void)addObject:(id)anObject;

2、向數組中指定的index 位置,插入一個新的對象
– (void)insertObject:(id)anObject atIndex:(NSUInteger)index;

3、移除數組的最後一個元素
– (void)removeLastObject;

4、移除指定為指定位置的元素
– (void)removeObjectAtIndex:(NSUInteger)index;

5、使用anObject 替換 下標為 index 位置上的元素
– (void)replaceObjectAtIndex:(NSUInteger)index withObject:(id)anObject;

6、使用一個數組給當前的數組添加元素
– (void)addObjectsFromArray:(NSArray *)otherArray;

7、交換指定 index1 和 index2 兩個位置上的元素
– (void)exchangeObjectAtIndex:(NSUInteger)idx1 withObjectAtIndex:(NSUInteger)idx2;

8、 移除數組中的所有元素
– (void)removeAllObjects;

9、使用anObject 對象替換 range 位置上的元素,
相當於刪除 range位置的元素,然後在把 anobject 插入到這個位置
– (void)removeObject:(id)anObject inRange:(NSRange)range;

10、如果指定的元素,如果元素不存在,則不移除
– (void)removeObject:(id)anObject;

11、 同9 相同
– (void)removeObjectIdenticalTo:(id)anObject inRange:(NSRange)range;

12、方法內容 和9 相同
– (void)removeObjectIdenticalTo:(id)anObject;

13、不建議使用
– (void)removeObjectsFromIndices:(NSUInteger *)indices numIndices:(NSUInteger)cnt NS_DEPRECATED(10_0, 10_6, 2_0, 4_0);

14、移除給定數組中的元素
– (void)removeObjectsInArray:(NSArray *)otherArray;

15、移除指定range 上的所有元素
– (void)removeObjectsInRange:(NSRange)range;

16、使用otherArray 數組中 otherRange 位置上的元素,替換當前數組中 range 位置上的元素
– (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray range:(NSRange)otherRange;

17 、 使用otherArray 數組上的位置,替換 range 上的元素
– (void)replaceObjectsInRange:(NSRange)range withObjectsFromArray:(NSArray *)otherArray;

18、對當前的數組排序,使用排序算法
– (void)sortUsingFunction:(NSInteger (*)(id, id, void *))compare context:(void *)context;

19、對當前的數組排序,使用排序算法
– (void)sortUsingSelector:(SEL)comparator;

20、在indexes 的位置上,插入一個數組
– (void)insertObjects:(NSArray *)objects atIndexes:(NSIndexSet *)indexes;

21、移除制定indexes 位置上的元素
– (void)removeObjectsAtIndexes:(NSIndexSet *)indexes;

22、使用一個對象數組,替換 indexes 位置上的 元素
– (void)replaceObjectsAtIndexes:(NSIndexSet *)indexes withObjects:(NSArray *)objects;

23
– (void)setObject:(id)obj atIndexedSubscript:(NSUInteger)idx NS_AVAILABLE(10_8, 6_0);

24、排序
– (void)sortUsingComparator:(NSComparator)cmptr
25、 使用後面的元素進行排序
– (void)sortWithOptions:(NSSortOptions)opts usingComparator:(NSComparator)cmptr

25、 創建NSMutableArray 數組
+ (id)arrayWithCapacity:(NSUInteger)numItems;
– (id)initWithCapacity:(NSUInteger)numItems;

發佈留言