Objective-C集合總結

Objective-C裏面的集合主要包括:NSString,NSMutableString,NSArray,NSMutableArray,NSDictionary,NSMutableDictionaryc#

首先,NSString,NSArray和NSDictionary都是不可變的,一經分配空間,長度是固定的。另外3個類是可變的,初始化後還能夠動態增長空間,長度不固定。這幾個類在初始化和相關操做上有必定的類似性,放在一塊兒對比學習,能加深理解。數組和字典有一些特殊的地方須要注意,後面進行說明,先從初始化開始:數組

字符串-NSString

字面量建立:NSString *string = @"this is a string"; app

格式化建立:+ (id) stringWithFormat:(NSString *) format,...;oop

例如:NSString * str = [NSString stringWithFormat:@"Your age is %d,and your height is %d",26,140];學習

從前面的+號能夠看出,這是一個類方法優化

一、比較大小

方法一:- (BOOL) isEqualToString:(NSString *) aStringui

用來比較接收方和做爲參數傳遞過來的字符串,返回一個BOOL(YES或NO)來表示兩個字符串的內容是否相同,例如:this

NSString *thing1 = @"hello 5";
NSString *thing2 = [NSString:stringWithFormat:@"hello %d",5];
if([thing1:isEqualToString:thing2])
{
    NSLog(@"they are the same!");  
}

thing1==thing2與[thing1 isEqualToString:thing2]的區別,==運算符只判斷thing1和thing2的指針數值是否相同,即:他們是不是同一事物;後者用來判斷兩個字符串的內容是否相同spa

方法二:- (NSComparisonResult) compare: (NSString *) aString option: (NSStringCompareOptions) mask;指針

compare方法將接收對象和傳遞過來的字符串逐個進行比較,返回一個NSComparisonResult(枚舉類型)來表示比較結果。NSComparisonResult的定義以下:

enum
{
    NSOrderedAscending = -1,
    NSOrderedSame,
    NSOrderedDescending
};
typedef NSInteger NSComparisonResult

參數option是一個掩位碼,能夠經過位或來添加標記,經常使用的標記以下:

  • NSCaseInsensitiveSearch:不區分大小寫自負。
  • NSLiteralSearch:進行徹底比較,區分大小寫字符。
  • NSNumbericSearch:比較字符串的字符個數,而不是字符串值。若是沒有這個選項,100會排在99的前面。

     若是你相比較字符串,須要忽略大小寫並按字符個數進行排序,那麼應該這麼作:

if([thing1 compare:thing2 option:NSCaseInsensitiveSearch | NSNumerbicSearch] == NSOrderedSame)
{
    NSLog(@"They match!");
}

 二、字符串包含

起始處包含(以aString開頭):- (BOOL) hasPrefix: (NSString *) aString;

結尾處包含(以aString結尾):- (BOOL) hasSuffix: (NSString *) aString;

內部包含(內部含有aString):- (NSRange) rangeOfString: (NSString *) aString;

rangeOfString方法返回的是一個NSRange結構體,封裝來字符串匹配的位置和可以匹配的字符個數,例如:

NSString *fileName = @"draft-chapter.pages";
NSRange range = [fileName rangeOfString:@"chapter"];
//返回的range.location爲6,range.length爲7

若是傳遞的參數在接收字符串中沒有找到,那麼range.location則等於NSNotFound。

可變字符串-NSMutableString

NSMutableString是NSString的子類,長度可變,相似於c#中的StringBuilder,聲明以下:

+ (id) stringWithCapacity: (NSUInteger) capacity;

這裏的capacity只是個建議值,實際字符串大小並不限於所提供的容量。

一、添加字符串:

  • - (void) appendString: (NSString *) aString;
  • - (void) appendFormat: (NSString *) format,...;

例如:

NSMutableString *string = [NSMutableString stringWithCapacity:50];
[string appendString:@"Hello there "];
[string appendFormat:@"human %d!",66];
//最後string的值爲:"Hello there human 66!"

二、刪除字符串

方法:- (void) deleteCharactersInRange:(NSRange) aRange;

NSMutableString *friends = [NSMutableString stringWithCapacity:50];
[friends appendString:@"James BethLynn Jack Evan"];
NSRange jackRange = [friends rangeOfString:@"jack"];
jackRange.length++;
[friends deleteCharactersInRange:jackRange];
//最終結果:"James BethLynn Evan"

NSMutableString是NSString的子類,因此任何使用NSString的地方均可以用NSMutableString來代替,例如,咱們能夠添加格式化字符串:

NSMutableString *string = [NSMutableString stringWithFormat:@"jo%dy",2];  //string的值爲"jo2y"

不可變數組-NSArray

NSArray是一個Cocoa類,它比C、C++數組強大的地方在於,NSArray能夠保存任意類型的對象,好比字符串、自定義類型甚至其餘數組或字典,可是請記住:NSArray只能保存對象,像int ,char,double等基本數據類型不能直接保存,須要經過轉換成對象才能加入數組。另外,NSArray是不可變數組,一旦建立它的長度就固定下來來,不能添加和刪除任何元素,固然數組中包含的對象是能夠改變的,只不過數組對象自己是一直都不會變的。

NSArray的建立:

  • 一、NSArray *array = [[NSArray alloc] initWithObjects:@"1",@"2",@"3",nil];
  • 二、NSArray *array1 = [NSArray arrayWithArray:array];(以現用的數組建立數組)
  • 三、NSArray *array2 = [NSArray arrayWithObjects:@"one",@"two",@"three",nil];  //對象列表必須以nil結尾
  • 四、NSArray *array3 = @[@"one",@"two",@"three"]; //以字面量的方式建立時,沒必要在結尾處特地補上nil 

相關方法:

  - (NSUInteger) count;   //獲取數組中對象的個數

  - (id) objectAtIndex:(NSUInteger)index;  //獲取指定索引處的對象

  還能夠經過字面量訪問數組,例如:id *myObject = array[1];咱們能夠利用計數和取值來遍歷數組中的對象:

//方式一
NSUInteger count = [array count];
for(NSUInteger i = 0; i < count; i++)
{
     NSLog(@"index %d has %@.", i, [array objectAiIndex:i]);  
}

//方式二
for(NSUInteger j = 0; j < count; j++)
{
    NSLog(@"index %d has %@", j, array[j]);
}

NSArray還有一種特別的建立方式,就是經過切分字符串,方法的聲明以下:

- (NSArray) componentsSeparatedByString:(NSString *) separater;

例如:NSString *string = @"oop:ack:bork:greeble:ponies";

   NSArray *chunks = [string componentsSeparatedByString:@":"];

還能夠反過來用指定字符串來合併NSArray中的元素來建立字符串,例如:

   string = [chunks componentsJoinedByString:@"+"]; //string的內容爲:"oop+ack:bork+greeble+ponies"

可變數組-NSMutableArray

NSMutableArray的建立:+ (id) arrayWithCapacity:(NSUInteger) numItems;

與NSMutableString中的stringWithCapacity方法同樣,這裏的容量只是一個建議值,當超出容量時可變數組可以動態的擴展空間。

尾部添加對象:- (void) addObject:(id) anObject;

指定索引處插入對象: - (void) insertObject:(id) anObject atIndex:(NSUInteger) index;  //後面的元素向後移

刪除指定索引處的對象: - (void) removeObjectAtIndex:(NSUInteger) index;  

刪除所有對象:- (void) removeAllObjects;

NSMutableArray *array = [NSMutableArray arrayWithCapacity:17]; //建立
for(NSInteger i = 0; i < 4; i++) //在尾部添加四個對象
{
    Tire *tire = [Tire new];
    [array addObject:tire];
}
Tire *t = [Tire new];
[array insertObject:t atIndex:1]; //在第二個位置處添加一個對象 [array removeObjectAtIndex:
1]; //刪除索引爲1的對象,即:第二個對象
[array removeAllObjects];

不可變字典-NSDictionary

   和c#中的字典同樣,Objective-c中的NSDictionary能在給定關鍵字(一般是一個NSString字符串)下存儲一個數值,而後能夠經過這個關鍵詞來查找相應的數據。相對於數組,字典採用的是鍵查詢的優化方式,它能夠當即找出要查找的數據,而不須要遍歷整個數組,對於頻繁的查詢和大型數據集來講,使用字典比數組要快得多。

  像NSString和NSArray同樣,NSDictionary也是不可變的,在建立新的NSDictionary時,就要提供該字典所存儲的所有對象和關鍵字。

  基本操做:

  一、建立方式一:經過字面量方式,使用相似@{key:value,...}的方法來定義

  二、建立方式二:經過dictionaryWithObjectsAndKeys方法,該方法接受對象和關鍵字交替出現的序列,以nil值做爲終止符號,定義以下:

  + (id) dictionaryWithObjectsAndKeys:(id) firstObject,...

  三、獲取字典中的數據方式一:使用objectForKey,接收一個關鍵字,經過該關鍵字來獲取對應的數據,該方法定義以下:

  - (id) objectForKey:(id) aKey;

  四、獲取字典中的數據方式二:dictionary[key];

  示例代碼以下:

 1 Tire *tire1 = [Tire new];
 2 Tire *tire2 = [Tire new];
 3 Tire *tire3 = [Tire new];
 4 Tire *tire4 = [Tire new];
 5 NSDictionary *tires = [NSDictionary dictionaryWithObjectsAndKeys:tire1,@"front-left",tire2,@"front-right",tire3,@"back-left",tire4,@"back-right",nil];
 6 //字面量方式
 7 NSDictionary *tires = @{@"front-left":tire1,@"front-right":tire2,@"back-left":tire3,@"back-right":tire4};
 8 
 9 //獲取方式一
10 Tire *tire = [tires objectForKey:@"front-left"];
11 //獲取方式二
12 Tire *tire = tires[@"front-left"];

可變字典-NSMutableDictionary

  能夠經過向NSMutableDictionary類發送dictionary消息來建立新的NSMutableDictionary對象,也能夠經過dictionaryWithCapacity:方法來建立帶初始大小的可變字典對象,這個方法的定義以下:

  + (id) dictionaryWithCapacity:(NSUInteger) numItems;

  與以前提到過的NSMutableString和NSMutableArray同樣,在這裏,字典的容量只是一個建議值,而不是對其大小的限制。

  能夠經過setObject:forKey:的方法來爲字典添加元素,定義以下:

  - (void) setObject:(id) andObject forKey:(id) aKey;

  若是對字典中已有的關鍵字使用setObject:forKey:方法,那麼這個方法將會用新值替換原有的數據。若是想刪除一些關鍵字,可以使用removeObjectForKey:方法,定義以下:

  - (void) removeObjectForKey:(id) aKey;

  示例代碼以下:  

 1 //建立詞典對象,初始化長度爲10
 2 NSMutableDictionary *tires = [NSMutableDictionary dictionaryWithCapacity:10];
 3 // NSMutableDictionary *tires = [NSMutableDictionary dictionary];
 4 
 5 //動態添加元素
 6 [tires setObject:tire1:forKey:@"front-left"];
 7 [tires setObject:tire2:forKey:@"front-right"];
 8 [tires setObject:tire3:forKey:@"back-left"];
 9 [tires setObject:tire4:forKey:@"back-right"];
10 
11 //刪除元素
12 [tires removeObjectForKey:@"back-left"];
相關文章
相關標籤/搜索