黑马程序员——集合

一、NSArray和NSMutableArray

(一)NSArray不可变数组

(1)NSArray的基本介绍

NSArray是OC中使用的数组,是面向对象的,以面向对象的形式操纵对象,是不可变数组。

C语言数组有一个缺点即数组中只能存放同种数据类型的元素。

OC数组只能存放OC对象,不能存放非OC对象,如int,结构体和枚举等。

(2)NSArray的创建

NSArray *array2 = [NSArray arrayWithObject:@"jack"];

// nil是数组元素结束的标记

NSArray *array3 = [NSArray arrayWithObjects:@"jack", @"rose", nil];

// 快速创建一个NSArray对象

NSArray *array4 = @[@"jack", @"rose", @"4324324"];

(3)NSArray的访问

//使用索引

NSLog(@"%@", [array3 objectAtIndex:1]);

//像C语言数组一样使用下标

NSLog(@"%@", array3[0]);

4)NSArray的遍历

数组的遍历有以下几种方式:

首先创建一个数组

Person *p = [[Person alloc] init];

NSArray *array = @[p, @"rose", @"jack"];

第一种方法:使用for循环遍历

id obj代表着数组中的每一个元素

int i = 0;

for (id obj in array)

{

// 找出obj元素在数组中的位置

NSUInteger i = [array indexOfObject:obj];

NSLog(@"%ld - %@", i, obj);

if (i==1)

{

break;

}

}

第一种方法:使用Block循环遍历

[array enumerateObjectsUsingBlock:

// 每遍历到一个元素,就会调用一次block

// 并且当前元素和索引位置当做参数传给block

^(id obj, NSUInteger idx, BOOL *stop)

{

NSLog(@"%ld - %@", idx, obj);

if (idx == 0)

{

// 停止遍历

*stop = YES;

}

}];

每拿到一个元素,就传递给obj,就会调用一次block,并且把当前的元素和索引位置当做参数传递给block。

注意1:break只使用在两种场合,即switch和循环结构中。

注意2:stop参数用来停止遍历,其值若为YES,则停止。

二)NSMutableArray可变数组

(1)NSMutableArray的基本使用

注意:NSMutableArray继承自NSArray,几乎拥有NSArray的一切方法。

NSMutableArray *array = [NSMutableArray arrayWithObjects:@"rose", @"jim", nil];

// 添加元素

[array addObject:[[Person alloc] init]];

[array addObject:@"jack"];

// 删除元素

//[array removeAllObjects];

// 删除指定的对象

// [array removeObject:@"jack"];

[array removeObjectAtIndex:0];

二、NSSet和NSMutableSet

(一)NSSet不可变集合

基本使用:

NSSet *s = [NSSet set];

NSSet *s2 = [NSSet setWithObjects:@"jack",@"rose", @"jack2",@"jack3",nil];

// 随机拿出一个元素

NSString *str =  [s2 anyObject];

// 错误写法

// [array addObject:nil];

(三)NSSet和NSArray的对比

(1)共同点:

1)都是集合,都能够存放多个对象

2)只能存放oc对象,不能存放非oc对象类型(如int等基本数据类型和结构体,枚举等)。

3)本身都不可变,都有一个可变的子类。

(2)不同点:

1)NSArray有顺序,NSSet没有顺序

三、NSDictionary和NSMutableDictionary

(一)NSDictionary不可变字典

(1)介绍

现实中的字典:根据索引找到具体的内容

OC中的NSDictionary:根据key找到value。里面存储的东西都是键值对。

(2)NSDictionary的创建

//第一种方式

NSDictionary *dict = [NSDictionary dictionaryWithObject:@"jack" forKey:@"name"];

//第二种方式

NSArray *keys = @[@"name", @"address"];

NSArray *objects = @[@"jack", @"北京"];

NSDictionary *dict = [NSDictionary dictionaryWithObjects:objects forKeys:keys];

//第三种方式

NSDictionary *dict = [NSDictionary dictionaryWithObjectsAndKeys:

@"jack", @"name",

@"北京", @"address",

@"32423434", @"qq", nil];

//第四种方式

NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

(3)NSDictionary的访问

NSDictionary *dict = @{@"name" : @"jack", @"address" : @"北京"};

//根据key获取对应的值

id obj = [dict objectForKey:@"name"];

id obj = dict[@"name"];

NSLog(@"%@", obj);

4)NSDictionary的遍历

NSDictionary *dict = @{

@"address" : @"北京",

@"name" : @"jack",

@"name2" : @"jack",

@"name3" : @"jack",

@"qq" : @"7657567765"};

//第一种方式:

NSArray *keys = [dict allKeys];

for (int i = 0; i<dict.count; i++)

{

NSString *key = keys[i];

NSString *object = dict[key];

NSLog(@"%@ = %@", key, object);

}

//第二种方式

[dict enumerateKeysAndObjectsUsingBlock:

^(id key, id obj, BOOL *stop) {

NSLog(@"%@ - %@", key, obj);

// *stop = YES;

}];

}

(二)NSMutableDictionary可变字典

(1)NSMutableDictionary的基本使用

NSMutableDictionary *dict = [NSMutableDictionary dictionary];

// 添加键值对

[dict setObject:@"jack" forKey:@"name"];

[dict setObject:@"北京" forKey:@"address"];

[dict setObject:@"rose" forKey:@"name"];

// 移除键值对

// [dict removeObjectForKey:<#(id)#>];

NSString *str = dict[@"name"];

//NSLog(@"%@", str);

NSLog(@"%@", dict);

时间: 2024-08-06 15:48:45

黑马程序员——集合的相关文章

黑马程序员——集合篇

------- android培训.java培训.期待与您交流! ---------- 1.集合类 为什么出现集合类? 面向对象语言对事物的体现都是以对象的形式,所以为了方便对多个对象的操作,就对对象进行存储,集合就是存储对象最常用的一 种方式. 数组和集合类同是容器,有何不同? 数组虽然也可以存储对象,但长度是固定的:集合长度是可变的.数组中可以存储基本数据类型,集合只能存储对象. 集合类的特点 集合只用于存储对象,集合长度是可变的,集合可以存储不同类型的对象. 2.集合框架的构成及分类 3.

黑马程序员——集合基础知识(泛型)

集合:泛型基础知识 泛型.(泛型就是类型参数化,默认的时object,虽然不用强制类型转换,这个就要你自己去写特性方法,比如compareto是string的特有方法吧,你可以写但是父类肯定调用不了) itnex t对象都是obj要使用对象的特性功能必须强.编译的时候没问题,因为都不知道你会传什么对象,你橙子也可以当作apple来传,设计的时候并不知道! 泛型作用.1.用于解决安全问题.运行时期出现的问题classcastexception转移到编译时期.2.迭代器里面的itnext()不用强转

黑马程序员——集合基础知识(Collection)

集合基础知识 数组:长度固定,可存基本数据和对象. 集合:只能放对象,不固定.容器也有共性,不断抽取成一个体系,集合框架.参阅顶层创建底层.顶层是collection.collection里有两个常见的接口,List和Set.常见集合有Arraylist,linkedlist,vector,hashSet TreeSet.为什么会出现这么多的容器呢,因为每一个容器对数据的存储方式都有不一样,.这个存储方式称之为数据结构!!因为他们的特点不一样 list因为有脚标存储和删除的效率很低,Set的效率

黑马程序员——集合基础知识(Map)

Map概念 要同时存储两个元素,他们之间有映射关系,每个键不能重复,每个键只能映射到一个值. 存储键值对,并且键是唯一的. 1.添加. put()如果添加的键原来有值,后添加的值会覆盖前面的值,并返回之前的值. 2.删除 remove()按键删除. 3.判断 4.获取 get(object key) size() value()拿值value返回的是值的集合... HashTable 底层是哈西数据结构,不可以存入null键null值,线程同步. HashMap 底层是哈西表数据结构,允许使用n

黑马程序员-----集合框架类(三) Map集合

黑马程序员-----集合框架类(三) Map集合 1.1 Map集合:该集合存储键值对.一对一对往里存.而且要保证键的唯一性. 1,添加. put(K key, V value) putAll(Map<? extends K,? extends V> m) 2,删除. clear() remove(Object key) 3,判断. containsValue(Object value) containsKey(Object key) isEmpty() 4,获取. get(Object ke

黑马程序员-集合框架(Map和Collections)

--Java培训.Android培训.iOS培训..Net培训.期待与您交流!--- 一.概述 Map是一种存储键值对的存储容器,而且保证键的唯一性.提供一种以"键"标识"值"的数据存储方式.接口形式为:Map<K,V>,其中K是此映射所维护的键的类型,V是映射值的类型.其有两个常用子类,HashMap和TreeMap,另有HashTable与HashMap功能类似,是早期版本.三者特点与不同如下: HashMap:JDK1.2版本出现,底层使用哈希表数

黑马程序员——集合小结

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 接口:Collection Collection是最基本的集合接口,一个Collection代表一组Object,即Collection的元素(Elements).一些Collection允许相同的元素而另一些不行.一些能排序而另一些不行.Java SDK不提供直接继承自Collection的类,Java SDK提供的类都是继承自Collection的“子接口”如List和Set. 所有实现C

黑马程序员-集合(一)

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 引用:java.util.Collection 为什么要出现集合: Java是纯面向对象语言,而面向对象语言对事物的体现就是以对象的形式存在的.因此我们想对对象进行操作,就要对对象进行储存,那么聚合就出现了. 数组和集合类同样是容器.有什么不同? 数组虽然是可以存储对象,但是长度是固定不变得.集合的长度可以动态改变的.数值是可以存储基本数据类型,集合只能存储对象.(如String) Colle

黑马程序员-集合(二)contains()方法的内部探索

------Java培训.Android培训.iOS培训..Net培训.期待与您交流! ------- 我们知道集合是用来存储对象的.在他们实现了众多的接口我们以Arraylist为列子 所有已实现的接口: Serializable, Cloneable, Iterable<E>, Collection<E>, List<E>, RandomAccess 集合当中有这样的一个方法.在API文档当中是下面这样解释的. contains(Object o) 如果此列表中包含

黑马程序员——集合框架(一)

package com.yang.ex; import java.util.ArrayList; /*集合类: * 面向对象语言的体现都在对象行使,为了方便对对象操作,集合就是最常见的储存对象 * * 数组与集合类的不同: * 数组的长度是固定的,并且类型是固定的的,但是集合的长度是可变的.数组中可以储存基本数据类型,但是集合智能存储对象 * * 集合类的特点: * 集合只用于储存对象,集合的长度是可变的.集合合一储存不同类型的对象 * 每一个容器对数据的存储方式都有不同 * 每一个存储方式称为