热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

Objective-C_字典、集合、数组排序

一字典类二集合类三数组字典集合的快速遍历四数组排序五数组元素按照数值大小排序一、字典类字典⽤于保存具有映射关系(key-value对)数据的集合。对于“姓名:张三”来讲,key就是“姓

  • 一字典类
  • 二集合类
  • 三数组字典集合的快速遍历
  • 四数组排序
  • 五数组元素按照数值大小排序

一、字典类

字典⽤于保存具有映射关系(key-value对)数据的集合。对于“姓名:张三”来讲,key就是“姓名”,key对应的value是“张三”。一个key-value对认为是⼀个条目,字典是存储key-value对的容器。与数组不同,字典靠key存取元素。key不能重复,value必须是对象。键值对在字典中是无序存储的。字典也分为,不可变字典(NSDictionary)和可变字典(NSMutableDictionary)。

NSDictionary,不可变字典,继承NSObject。即字典一旦创建,键值对就不可更改,不可添加,不可删除。仅能读取key或者value。

        /* 不可变字典 */
/* 创建对象 */
NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
@"ZhangSan", @"name",
@"Man", @"sex",
@"18", @"age",
@"130", @"weight",
nil];

/* 输出字典 */
NSLog(@"%@", dic);

/* 获取所有的Key值 */
[dic allKeys];
NSLog(@"%@", [dic allKeys]);

/* 获取所有的Value值 */
[dic allValues];
NSLog(@"%@", [dic allValues]);

/* 通过Key查询Value值 */
[dic objectForKey:@"name"];
NSLog(@"%@", [dic objectForKey:@"name"]);

[dic valueForKey:@"name"];
NSLog(@"%@", [dic valueForKey:@"name"]);

/* 遍历字典 */
NSArray *keyArr = [dic allKeys];
for (int i = 0; i .count; i++) {
NSString *keyStr = [keyArr objectAtIndex:i];
NSLog(@"%@", [dic objectForKey:keyStr]);
}

/* 快速遍历 */
for (NSString *key in dic) {
NSLog(@"%@", [dic objectForKey:key]);
}

/* keyArr快速遍历 */
for (NSString *str in keyArr) {
NSLog(@"%@", str);
}

NSMutableDictionary,可变字典,继承NSDictionary。可以对管理的键值对进⾏行增、删、改。

        /* 可变字典 */
NSMutableDictionary *mDic = [NSMutableDictionary dictionaryWithObjectsAndKeys:
@"LiSi", @"name",
@"18", @"age",
@"woman", @"sex",
@"120", @"weight",
nil];
for (NSString *key in mDic) {
NSLog(@"%@", [mDic objectForKey:key]);
}

/* 增加键值对 */
[mDic setObject:@"170cm" forKey:@"height"];
[mDic setValue:@"volleyball" forKey:@"hobby"];

for (NSString *key in mDic) {
NSLog(@"%@", [mDic objectForKey:key]);
}

/* 修改键值对 */
[mDic setObject:@"20" forKey:@"age"];
for (NSString *key in mDic) {
NSLog(@"%@", [mDic objectForKey:key]);
}

/* 删除键值对 */
[mDic removeObjectForKey:@"hobby"];
for (NSString *key in mDic) {
NSLog(@"%@", [mDic objectForKey:key]);
}

二、集合类

集合类*NSSet,类似数学中集合的概念,具有确定性、无序性、互异性*。即集合中存储的元素必须是对象类型,存储的元素是无顺序的,存储的元素唯一。集合类也分为NSSet和NSMutableSet。

NSSet的示例代码如下:

        /* 不可变Set */
/* 创建 */
NSSet *set = [NSSet setWithObjects:@"四平", @"长春", @"吉林", @"四平", nil];

/* 获取Set元素个数 */
NSLog(@"%lu", set.count);

/* 获取Set中某一元素 */
NSLog(@"%@", [set anyObject]);

/* 判断Set中是否包含某一个对象 */
if ([set containsObject:@"沈阳"]) {
NSLog(@"有");
}
else {
NSLog(@"无");
}

/* 遍历集合 */
for (NSString *str in set) {
NSLog(@"%@", str);
}

NSMutableSet的示例代码如下:

        /* 可变集合 */
NSSet *set2 = [NSSet setWithObjects:@"DaLian", @"BeiJing", nil];
NSMutableSet *mSet = [NSMutableSet setWithSet:set2];

/* 合并两个集合 */
[mSet unionSet:set];
for (NSString *str in mSet) {
NSLog(@"%@", str);
}

/* 相交两个集合 */
[mSet intersectSet:set];

/* 添加元素 */
[mSet addObject:@"通化"];

/* 删除元素 */
[mSet removeObject:@"BeiJing"];
for (NSString *str in mSet) {
NSLog(@"*%@*", str);
}

NSCountedSet是NSMutableSet的子类,能记录元素的重复次数。在NSSet的基础上添加了计数功能。

NSCountedSet的示例代码如下:

        /* NSCountedSet类 */
NSArray *arr = [NSArray arrayWithObjects:@"Zhang", @"LiSi", @"LiSi", @"Wang", @"Wang", @"LiSi", nil];
NSCountedSet *countSet = [NSCountedSet setWithArray:arr];

/* 查看countSet元素个数 */
NSLog(@"%lu", countSet.count);

/* LiSi计数 */
NSLog(@"%lu", [countSet countForObject:@"LiSi"]);

三、数组、字典、集合的快速遍历
for (<#type *object#> in <#collection#>) {

}

  1. object是遍历得到的元素对象。
  2. collection是集合类型的对象:数组、字典、集合。

集合类型枚举的特点

  • 数组枚举得到数组中的元素对象
  • 字典枚举得到字典中的key值
  • 集合枚举得到集合中的元素对象
        NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
@"ZhangSan", @"name",
@"Man", @"sex",
@"18", @"age",
@"130", @"weight",
nil];

/* 快速遍历 */
for (NSString *key in dic) {
NSLog(@"%@", [dic objectForKey:key]);
}

四、数组排序

数组排序取决于判断条件,判断条件决定了排序的⽅式(升序、降序)。iOS为数组提供了排序⽅法,同时提供了接口让我们传递判断条件。

        NSMutableArray *mArr = [NSMutableArray arrayWithObjects:@"3", @"2", @"1", @"4", nil];

/* 可变数组排序 */

/* @selector --> 方法选择器, 获取方法名的意思.
* compare: --> 数组中元素的方法(元素是字符串, compare是字符串的一个方法)
*/

[mArr sortUsingSelector:@selector(compare:)];
NSLog(@"%@", mArr);

/* 不可变数组排序 */
NSArray *arr = [NSArray arrayWithObjects:@"4", @"2", @"1", @"3", nil];
NSArray *sortArr = [arr sortedArrayUsingSelector:@selector(compare:)];
NSLog(@"%@", sortArr);

五、数组元素按照数值大小排序

数组中存储的元素是对象类型,如果存储的元素都是数值对象,按照上述方法排序就不能得到正确的结果。因此,需要使用NSNumberFormatter将字符串转化为NSNumber对象。具体实现代码如下:

#pragma mark - 数值数组排序
#if 1
NSArray *arr = @[@"1", @"12", @"122", @"67", @"50", @"666"];

NSMutableArray *numArr = [NSMutableArray array];

for (NSString *string in arr) {
// NSNumberFormatter格式转化
NSNumberFormatter *format = [[NSNumberFormatter alloc] init];
// NSString 转成 NSNumber
NSNumber *num = [format numberFromString:string];
[numArr addObject:num];
}
// 根据数组里元素的类型来调用相应的方法, 相当于排序中条件判断
NSLog(@"%@", [numArr sortedArrayUsingSelector:@selector(compare:)]);
#endif


推荐阅读
  • STL迭代器的种类及其功能介绍
    本文介绍了标准模板库(STL)定义的五种迭代器的种类和功能。通过图表展示了这几种迭代器之间的关系,并详细描述了各个迭代器的功能和使用方法。其中,输入迭代器用于从容器中读取元素,输出迭代器用于向容器中写入元素,正向迭代器是输入迭代器和输出迭代器的组合。本文的目的是帮助读者更好地理解STL迭代器的使用方法和特点。 ... [详细]
  • iOS 类簇及越界处理
     估计做iOS开发的朋友都遇到多一个问题,就是数组越界,-[__NSArray0objectAtIndex:]:index1beyondboundsforemptyNSArray’ ... [详细]
  • Java容器中的compareto方法排序原理解析
    本文从源码解析Java容器中的compareto方法的排序原理,讲解了在使用数组存储数据时的限制以及存储效率的问题。同时提到了Redis的五大数据结构和list、set等知识点,回忆了作者大学时代的Java学习经历。文章以作者做的思维导图作为目录,展示了整个讲解过程。 ... [详细]
  • Myappcrashedandthecodeisthefollowing:我的应用程序崩溃,代码如下:elseif(){CGDetailVie ... [详细]
  • nil用来给对象赋值(Objective-C中的任何对象都属于id类型),NULL则给任何指针赋值,NULL和nil不能互换,nil用于类指针赋值(在Objective-C中类是一 ... [详细]
  • jsappsugar,基于,js,语法,定义 ... [详细]
  • ObjectiveC与Swift之间的互相调用和跳转
    Objective-C与Swift之间的互相调用和跳转-一、OC和Swift互相跳转首先在需要引入Swift的文件中导入头文件#import工程名-Swift.hOC跳转Swift ... [详细]
  • 我的iOS开发入门自学路径
    我有一个清单,列着希望在大学里完成的事。比如,学一门乐器,和朋友去旅游,搭建自己的博客,去滑翔,看各主题的书籍。其中一项是,写自己的App并且上架。去年开始,我准备完成这一项,所以 ... [详细]
  • LeetCode笔记:剑指Offer 41. 数据流中的中位数(Java、堆、优先队列、知识点)
    本文介绍了LeetCode剑指Offer 41题的解题思路和代码实现,主要涉及了Java中的优先队列和堆排序的知识点。优先队列是Queue接口的实现,可以对其中的元素进行排序,采用小顶堆的方式进行排序。本文还介绍了Java中queue的offer、poll、add、remove、element、peek等方法的区别和用法。 ... [详细]
  • 本文讨论了一个关于cuowu类的问题,作者在使用cuowu类时遇到了错误提示和使用AdjustmentListener的问题。文章提供了16个解决方案,并给出了两个可能导致错误的原因。 ... [详细]
  • 本文详细介绍了Java中vector的使用方法和相关知识,包括vector类的功能、构造方法和使用注意事项。通过使用vector类,可以方便地实现动态数组的功能,并且可以随意插入不同类型的对象,进行查找、插入和删除操作。这篇文章对于需要频繁进行查找、插入和删除操作的情况下,使用vector类是一个很好的选择。 ... [详细]
  • iOS逆向工程(三):利用Cycript调试App
    利用Cycript调试App一、Cycript是什么?Cycript是一种脚本语言,是Ob ... [详细]
  • Objective C接入Sonar代码扫描
    目录技术方案环境准备扫描器配置项目配置SonarQube配置jenkins接入一些坑技术方案Sonar本身有对OC的代码扫描插件——SonarCFamily,但是是收费的。出于成本 ... [详细]
  • iOS安全攻防(二十四):敏感逻辑的保护方案(1)Objective-C代码容易被hook,暴露信息太赤裸裸,为了安全,改用C来写吧!当然不是全部代码都要C来写,我指的是敏感业务逻 ... [详细]
  • 多态性这个词表示有许多形式。通常,当存在类的层次结构并且通过继承相关时,会发生多态性。Objective-C多态表示对成员函数的调用将导致执行不同的函数,具体取决于调用该函数的对 ... [详细]
author-avatar
大男孩小男淫
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有