1. 程式人生 > >Objective-C語法之NSSet和NSMutableSet

Objective-C語法之NSSet和NSMutableSet

NSSet和NSMutableSet是無序的, 但是它保證資料的唯一性。當插入相同的資料時,不會有任何效果。從內部實現來說是hash表,所以可以常數時間內查詢一個數據。

ps:

散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把關鍵碼值對映到表中一個位置來訪問記錄,以加快查詢的速度。這個對映函式叫做雜湊函式,存放記錄的陣列叫做散列表。 給定表M,存在函式f(key),對任意給定的關鍵字值key,代入函式後若能得到包含該關鍵字的記錄在表中的地址,則稱表M為雜湊(Hash)表,函式f(key)為雜湊(Hash) 函式

1、NSSet的使用
[NSSet setWithSet:(NSSet *)set]; 用另外一個set物件構造
[NSSet setWithArray:(NSArray *)array];用陣列構造
[NSSet setWithObjects:...]:建立集合物件,並且初始化集合中的數值,結尾必需使用nil標誌。
[set count] ; 得到這個結合物件的長度。
[set containsObject:...]: 判斷這個集合中是否存在傳入的物件,返回Bool值。
[set objectEnumerator]: 將集合放入迭代器。
[enumerator nextObject]:得到迭代器中的下一個節點資料,使用while遍歷這個迭代器,方可遍歷集合物件中的物件。
[set isEqualToSet:objset]:判斷兩個集合是否完全相等,返回Bool值。
[set isSubsetOfSet:objset]:判斷集合中的所有資料是否都相等與objeset集合中,返回Bool值。
[set allObjects];

示例程式碼:

1.1 以NSArray構造set

        NSArray *array = [[NSArray alloc] initWithObjects:@"物件abc",@"rongfzh", @"totogo2010",nil];
        NSSet *set3 = [NSSet setWithArray:array];
        NSLog(@"%@", set3);
列印:
2012-07-10 09:39:02.015 objectiveC[720:403] {( rongfzh, "\U5bf9\U8c61abc", totogo2010 )}

1.2 set的一些比較方法的使用。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSSet *set = [NSSet setWithObjects:@"25",@"age",@"張三",@"name",@"男",nil];
        NSSet *set1 = [NSSet setWithObjects:@"25",@"age",@"張三",@"name",@"男",@"性別",nil];
        
        NSLog(@"set count:%lu", [set count]);
        //判斷是否含有age字串
        if([set containsObject:@"age"]) {
            NSLog(@"set包含age");
        }
        //判斷set 是否等於set1
        if ([set isEqualToSet:set1]) {
            NSLog(@"set 等於 set1");
        }
        //判斷set是否是否是set1的子集合
        if ([set isSubsetOfSet:set1]) {
            NSLog(@"set isSubsetOfSet set1");
        }
        //獲取所有set物件
        NSArray *array = [set allObjects];
        NSLog(@"array:%@", array);
        
        //迭代遍歷
        NSEnumerator *enumerator = [set objectEnumerator];
        for (NSObject *object in enumerator) {
            NSLog(@"set1裡的物件:%@", object);
        }
    }
    return 0;
}


列印結果:

2012-07-10 09:50:32.018 objectiveC[939:403] set count:5 2012-07-10 09:50:32.020 objectiveC[939:403] set包含age 2012-07-10 09:50:32.021 objectiveC[939:403] set isSubsetOfSet set1 2012-07-10 09:50:32.023 objectiveC[939:403] array:( age, 25, "\U7537", "\U5f20\U4e09", name ) 2012-07-10 09:50:32.027 objectiveC[939:403] set1裡的物件:age 2012-07-10 09:50:32.028 objectiveC[939:403] set1裡的物件:25 2012-07-10 09:50:32.028 objectiveC[939:403] set1裡的物件:男 2012-07-10 09:50:32.029 objectiveC[939:403] set1裡的物件:張三 2012-07-10 09:50:32.029 objectiveC[939:403] set1裡的物件:name

2、NSMutableSet的使用

NSMutableSet繼承NSSet,它可以使用NSSet的方法。

[NSMutableSet setWithCapacity:6]:建立可變集合物件,並且初始化長度為6。
[set addObject: obj] : 向集合中動態的新增物件。
[set removeObject:obj]:刪除集合中的一個物件。
[set removeAllObjects]:刪除集合中的所有物件。
[set unionSet:obj]:向集合中新增一個obj集合的所有資料。
[set minusSet:obj]:向集合中刪除一個obj集合的所有資料。
[set intersectSet]:向集合中刪除一個不包含obj集合的所有資料。

int main(int argc, const char * argv[])
{
    @autoreleasepool {
        NSMutableSet *muSet = [NSMutableSet setWithCapacity:6];
        [muSet addObject:@"物件1"];
        NSSet *set = [NSSet setWithObjects:@"物件2",@"物件3", @"被企鵝咬了一口", nil];
        //新增set資料
        [muSet unionSet:set];
        for (NSObject *object in muSet) {
            NSLog(@"all nuSet:%@",object);
        }
        NSSet *set1 = [NSSet setWithObjects:@"物件2",@"物件3", nil];
        
        //在muSet中刪除包含set1總資料
        [muSet minusSet:set1];
        for (NSObject *object in muSet) {
            NSLog(@"after minusSet:%@",object);
        }
            
    }
    return 0;
}


列印結果:

2012-07-10 10:09:08.194 objectiveC[1156:403] all nuSet:物件1 2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:被企鵝咬了一口 2012-07-10 10:09:08.196 objectiveC[1156:403] all nuSet:物件2 2012-07-10 10:09:08.197 objectiveC[1156:403] all nuSet:物件3 2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:物件1 2012-07-10 10:09:08.198 objectiveC[1156:403] after minusSet:被企鵝咬了一口

相關推薦

Objective-C語法NSSetNSMutableSet

NSSet和NSMutableSet是無序的, 但是它保證資料的唯一性。當插入相同的資料時,不會有任何效果。從內部實現來說是hash表,所以可以常數時間內查詢一個數據。 ps: 散列表(Hash table,也叫雜湊表),是根據關鍵碼值(Key value)而直接進行訪問的資料結構。也就是說,它通過把

Objective-C語法程式碼塊(block)的使用

程式碼塊本質上是和其他變數類似。不同的是,程式碼塊儲存的資料是一個函式體。使用程式碼塊是,你可以像呼叫其他標準函式一樣,傳入引數數,並得到返回值。 脫字元(^)是塊的語法標記。按照我們熟悉的引數語法規約所定義的返回值以及塊的主體(也就是可以執行的程式碼)。下圖是如何把塊

Objective-C語法第一個iPhone應用程式的那些事兒(十)

#import "HelloWorldViewController.h" @implementation HelloWorldViewController - (void)didReceiveMemoryWarning { // Releases the view if it doesn't ha

C#基本語法refout

ref和out ons 方式 基本 必須 sta read stat int ref參數必須在初始化的時候為其賦值,否則會報錯 static void Main(string[] args) { //out需要在初始化時為變量賦值,如果初始的值為空則會報錯

IOS開發開篇Objective-C語法基礎

     首先宣告:本系列技術部落格只作學習之用,不存在其它目的。      作者從在吸收眾多網友經驗基礎上,結合自己在IOS開發的經驗將對IOS開發技術進行總結,以供後來者學習,更希望藉此使自己對IOS開發的深入理解。       一、Objective-C與C的淵源   

Unity3D C#語法==!=運算子過載

前言 在編碼中,為了提高程式碼的可讀性,我們常常會去過載運算子以封裝一些運算,良好的運算子過載,能夠極大的提高程式碼的可讀性。本文會講==以及!=運算子過載。 過載函式 在C#中,過載的時候需要使用operator關鍵詞來宣告: public s

Java進擊C#——語法多線程

明顯 源碼 max 更多 sta 關於 如何使用 關系 中文 本章簡言 上一章中筆者對C#一些獨有的語法點進行講解,相信也可以看C#的一些神奇之處。那麽本章主要是放在多線程這方面的知識。不管是C#還是JAVA在開發過程或多或少都會用到關於多線程的編程。當然筆者不

Java進擊C#——語法ADO.NET

parameter stmt 深入 真的 讀者 方式 對他 新建 文本 本章簡言 上一章講到關於C#語法的基礎部分。了解相關的基礎部分之後我們就要去了解一下C#是什麽樣子訪問數庫的。C#把訪問數據庫這一部分的知識點叫作ADO.NET。即是JAVA常常講到的JDB

Objective-C 空指針野指針

cti info alt mage log 存儲 報錯 .com 指針 一、什麽是空指針和野指針 1.空指針 1> 沒有存儲任何內存地址的指針就稱為空指針(NULL指針) 2> 空指針就是被賦值為0的指針,在沒有被具體初始化之前,其值為0。 下面兩個都是

OBJECTIVE-C學習宏定義

list com 學習 c學習 ive 宏定義 objective cti lis %E6%B5%85%E8%B0%88aNDROID%E7%89%88%E6%9C%AC%E7%9A%84%E5%8C%BA%E5%88%AB http://music.baidu.com/

Objective-C類方法 load initialize

object mage cnblogs 什麽 類方法 color ech 引用 https 1、區別:+load 是只要類所在文件被引用就會被調用,而 +initialize 是在類或者其子類的第一個方法被調用前調用。所以如果類沒有被引用進項目,就不會有 +load 調用;

Objective-C中的@property@synthesize用法

有時 頭文件 關鍵字 nbsp nsa atomic 所有者 ica 風險 描述 @代表“Objective-C”的標誌,證明您正在使用Objective-C語言。 是Objective-C語言關鍵詞。 @property與@synthesize配對使用。 功能:讓編譯

Objective-C 基礎— Block本質+源碼剖析

www IT -s 猜想 field char 源碼 等等 eof block 又稱之為“自帶變量的匿名函數”,拋開OC語法定義block的形式不談,其實好多語言都有類似的函數,比如JS的回調函數(其實就是將一個匿名還是作為函數的實參)、swift的閉

Objective-C基礎@synthesize, @dynamic

not getter var 實例 利用 基礎 PE category protoc Objective-C基礎之@synthesize, @dynamic OC屬性用一個表達式最能清楚的解釋其實質:property = ivar + setter+getter,也就是說一

SQL語法DDLDML

sel ble tro har -c primary rom 多個 constrain SQL語法之DDL和DML DDL數據庫定義語言    create 創建    alter 修改    drop 刪除      drop和delete的區別    tr

Python語法選擇迴圈(if、while)

前言:在程式開發中,一共有三種流程方式: 順序:從上向下,順序執行程式碼 分支:根據條件判斷,決定執行程式碼的分支 迴圈:讓特定程式碼重複執行(解決程式設計師重複工作) 1.判斷的定義: 如果條件滿足,才能做某件事 如果條件不滿足,就做另外一件事情,或者什麼也不做 正是有了判斷,才使得程式世界豐富多彩,充滿

C++ Essentials lower_bound upper_bound 的比較函式格式不同

第一次注意到這個問題。 cppreference 上的條目: lower_bound upper_bound C++17 草案 N4659 lower_bound template<class ForwardIterator, class T> ForwardIterator lower_

Kotlin語法變數函式的定義

/** * 方法的定義, a, b為變數名 * fun 方法名(變數名: 變數型別): 返回值型別 */ fun sum(a: Int, b: Int): Int { return a + b } /** * 當表示式作為函式體的時候, 可以省去返回值型別 * 由函式自己推斷

C語言結構其他資料形式

1.結構變數 C語言中,提供了**結構變數(structure variable)**用於提高我們表示資料的能力,如果我們要列印一本書的圖書目錄,其中包含書名作者等等資訊,這樣我們需要這種資料形式既能包含字串,又能包含數字,而且各資訊獨立,此時我們就可以使用結構變數來儲存資料。 1.

C語言getchar()putchar()函式

一、getchar()函式 getchar()函式不帶任何引數,他從佇列中返回下一個字元。 ch = getchar()//讀取下一個字元的輸入,並把該字元的值付給變數ch 該語句與下面的語句效果相同: scanf("%c", &ch); 二、putchar(