iOS开发:NSSet的使用

简介: 在iOS开发过程中,有些时候会用到去重处理,也就是去掉重复的元素或者个数,然后再进行排序处理,这就使用到了集合(NSSet),它其实是一种哈希表,通过运用散列算法来查找集合中的元素。

前言

在iOS开发过程中,有些时候会用到去重处理,也就是去掉重复的元素或者个数,然后再进行排序处理,这就使用到了集合(NSSet),它其实是一种哈希表,通过运用散列算法来查找集合中的元素。


集合和数组的相同点:都是存储不同元素的地址,不同点:NSSet中的元素都是被自动过滤之后的不会重复的元素,NSArray中的元素却是允许重复的;NSSet是一个无顺序的集合,NSArray是一个有顺序的集合。相对来说,NSSet的处理效率比NSArray的要快。

本节内容就来简单的介绍一下NSSet的使用,并且会举一个实际使用案例来展示。

一、基本常用的方法

(一)NSSet

1、集合初始化:

NSSet在初始化的时候,赋值的时候如果放入两个相同元素的话,会自动删除其中一个相同的元素。eg:

NSSet *set1 = [[NSSet alloc] initWithObjects:@“a”,@“b”,@“c”,@“d”, nil]; //初始化集合
[set1 count]; //返回集合中的个数

2、NSSet的元素处理

NSMutableSet *mSet1 = [[NSMutableSet alloc] initWithObjects:@"1",@"2",@"3", nil];
NSMutableSet *mSet2 = [[NSMutableSet alloc] initWithObjects:@“1”,@“4”,@“5”, nil];
[mSet1 unionSet:mSet2];        //取出并集1,2,3,4,5
[mSet1 intersectSet:mSet2];  //取交集1
[mSet1 minusSet:mSet2];       //删除mSet1中与mSet2相同的元素 结果为:2,3,4,5

3、判断集合中是否含有某个元素

BOOL ret1 = [set1 containsObject:@“Apple”];  //判断集合中是否含有@“Apple”

4、判断两个集合是否相等

NSSet *set2 = [[NSSet alloc] initWithObjects:@“a”,@“b”,@“c”,@“d”, nil];
BOOL ret1 = [set isEqualToSet:set2]; //判断两个集合是否相等

5、判断set2是否是set3的子集

NSSet *set3 = [[NSSet alloc] initWithObjects:@“a”,@“b”,@“c”,@“d”,@“e”, nil];
BOOL  ret2 = [set2 isSubsetOfSet:set3];  //判断set2是否是set3的子集合

6、集合用枚举器来遍历

NSEnumerator  *enumerator = [set objectEnumerator];
NSString  *str;
while (str = [enumerator nextObject]) {
  ……
}

7、根据数组来初始化集合,也就是数组转换为集合

NSArray  *array1 = [[NSArray alloc] initWithObjects:@“1”,@“2”,@“3”,@“4”, nil];
NSSet  *set = [[NSSet alloc] initWithArray:array1];

8、集合转换为数组

NSArray  *array2 = [set allObjects];

(二)NSMutableSet

1、可变集合初始化

NSMutableSet *mSet1 = [NSMutableSet setWithObjects:@"1", @“2”, @“3”, @“4”, nil];  //可变集合初始化
NSMutableSet *mSet2 = [NSMutableSet setWithCapacity:0]; //可变集合

2、添加元素

[mSet1 addObject:@“5”];
[mSet1 addObject:@“6”];
[mSet1 addObject:@“6”];  //如果添加的元素有重复,实际情况只保留一个相同的元素

3、删除元素

[mSet1 removeObject:@“3”];
[mSet1 removeAllObjects];

4、NSIndexSet:指数集合(索引集合)

NSIndexSetNSIndexSet  *indexSet1 = [[NSIndexSet alloc] initWithIndexesInRange:NSMakeRange(1,3)]; //集合中的数字是1 2 3
//根据集合提取数组中指定位置的元素
NSArray  *array1 = [[NSArray alloc] initWithObjects:@“1”,@“2”,@“3”,@“4”, nil];
NSArray  *array2 = [array1 objectsAtIndexes:indexSet]; //返回2 3 4

5、NSMutableIndexSet:可变指数集合

NSMutableIndexSet *indexSet2 =[[NSMutableIndexSet alloc] init];
[indexSet2 addIndex:0];
[indexSet2 addIndex:2];
[indexSet2 addIndex:4]; //通过集合获取数组中指定元素
NSArray *array3 = [[NSArray alloc] initWithObjects:@“1”,@“2”,@“3”,@“4”,@“5”,@“6”, nil];
NSArray *array4 = [array3 objectsAtIndexes:indexSet];  //返回1 3 5

二、案例展示

这里的案例是为了在做本地的存储数据之前,先把重复的数据进行一个去重操作,然后再把这些数据进行本地存储。封装了一个工具类来进行系统化处理,具体代码及使用地方如下所示:

1、工具类.h文件:

#import <Foundation/Foundation.h>
@interface JSHistoryTool : NSObject
• (instancetype)sharedHistoryTool;
// 存储 **操作历史记录
• (void)writeTemp:(NSString *)temp time:(NSString *)time;
// 取出 **操作历史记录
• (NSArray *)getValue;
@end

01.png

2、工具类.m文件:

#import "JSHistoryTool.h"
@implementation JSHistoryTool
• (instancetype)sharedHistoryTool {
    static id instance = nil;
    static dispatch_once_t onceToken;
    dispatch_once(&onceToken, ^{
        instance = [[self alloc]init];
    });
    return instance;
}
• (void)writeTemp:(NSString *)temp time:(NSString *)time {
    NSArray *arr = [[NSUserDefaults standardUserDefaults] valueForKey:@"set"];
    NSMutableSet *sSet = [[NSMutableSet alloc] initWithArray:arr]; //先把现有存储的数组取出来,然后根据数组元素进行去重,最后再进行存储
    [sSet addObject:@{@"Temp":temp, @"Time":time}];
    NSArray *aa = [sSet allObjects];
    NSMutableArray *marr = [[NSMutableArray alloc] initWithArray:aa];
    if (marr.count > 20) {
        [marr removeObjectAtIndex:0];
    }
    [[NSUserDefaults standardUserDefaults] setObject:marr forKey:@"set"];
}
• (NSArray *)getValue {
    NSArray *arr = [[NSUserDefaults standardUserDefaults] valueForKey:@"set"];
    return [[arr reverseObjectEnumerator] allObjects];
}
@end

02.jpeg

3、控制器中具体调用地方的代码:

• (void)sendClick {
    if (![JSBLECenterManager sharedInstance].characteristic) {
        return;
    }
    _tempValue = [NSString stringWithFormat:@"%.0f", _centigradeDegree];
    _timeValue = [NSString stringWithFormat:@"%.0ld", (long)_timeDegree];
    _waterValue = [NSString stringWithFormat:@"%.0f", _waterDegree];
    NSString *ttData = [NSString stringWithFormat:@"TEA%@,%@,%@U", _tempValue, _timeValue, _waterValue];
    NSMutableSet *set1 = [[NSMutableSet alloc] initWithObjects:_tempValue, _timeValue, nil]; //初始化可变集合
    [[JSHistoryTool sharedHistoryTool] writeTemp:_tempValue time:_timeValue]; //通过工具类进行存储操作
    NSData *data = [ttData dataUsingEncoding:NSUTF8StringEncoding];
    // 根据上面的特征self.characteristic来写入数据
    [[JSBLECenterManager sharedInstance].peripheral writeValue:data forCharacteristic:[JSBLECenterManager sharedInstance].characteristic type:CBCharacteristicWriteWithResponse];
}

03.png

最后

以上就是本章的全部内容,欢迎关注三掌柜的微信公众号“程序猿by三掌柜”,三掌柜的新浪微博“三掌柜666”,欢迎关注!

相关文章
|
19天前
|
开发框架 前端开发 Android开发
安卓与iOS开发中的跨平台策略
在移动应用开发的战场上,安卓和iOS两大阵营各据一方。随着技术的演进,跨平台开发框架成为开发者的新宠,旨在实现一次编码、多平台部署的梦想。本文将探讨跨平台开发的优势与挑战,并分享实用的开发技巧,帮助开发者在安卓和iOS的世界中游刃有余。
|
2月前
|
Java Android开发 Swift
安卓与iOS开发对比:平台选择对项目成功的影响
【10月更文挑战第4天】在移动应用开发的世界中,选择合适的平台是至关重要的。本文将深入探讨安卓和iOS两大主流平台的开发环境、用户基础、市场份额和开发成本等方面的差异,并分析这些差异如何影响项目的最终成果。通过比较这两个平台的优势与挑战,开发者可以更好地决定哪个平台更适合他们的项目需求。
120 1
|
6天前
|
开发框架 Android开发 iOS开发
安卓与iOS开发中的跨平台策略:一次编码,多平台部署
在移动应用开发的广阔天地中,安卓和iOS两大阵营各占一方。随着技术的发展,跨平台开发框架应运而生,它们承诺着“一次编码,到处运行”的便捷。本文将深入探讨跨平台开发的现状、挑战以及未来趋势,同时通过代码示例揭示跨平台工具的实际运用。
|
11天前
|
Java 调度 Android开发
安卓与iOS开发中的线程管理差异解析
在移动应用开发的广阔天地中,安卓和iOS两大平台各自拥有独特的魅力。如同东西方文化的差异,它们在处理多线程任务时也展现出不同的哲学。本文将带你穿梭于这两个平台之间,比较它们在线程管理上的核心理念、实现方式及性能考量,助你成为跨平台的编程高手。
|
12天前
|
存储 前端开发 Swift
探索iOS开发:从新手到专家的旅程
本文将带您领略iOS开发的奇妙之旅,从基础概念的理解到高级技巧的掌握,逐步深入iOS的世界。文章不仅分享技术知识,还鼓励读者在编程之路上保持好奇心和创新精神,实现个人成长与技术突破。
|
15天前
|
安全 IDE Swift
探索iOS开发之旅:从初学者到专家
在这篇文章中,我们将一起踏上iOS开发的旅程,从基础概念的理解到深入掌握核心技术。无论你是编程新手还是希望提升技能的开发者,这里都有你需要的指南和启示。我们将通过实际案例和代码示例,展示如何构建一个功能齐全的iOS应用。准备好了吗?让我们一起开始吧!
|
21天前
|
安全 Swift iOS开发
Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法
本文深入探讨了 Swift 与 UIKit 在 iOS 应用界面开发中的关键技术和实践方法。Swift 以其简洁、高效和类型安全的特点,结合 UIKit 丰富的组件和功能,为开发者提供了强大的工具。文章从 Swift 的语法优势、类型安全、编程模型以及与 UIKit 的集成,到 UIKit 的主要组件和功能,再到构建界面的实践技巧和实际案例分析,全面介绍了如何利用这些技术创建高质量的用户界面。
23 2
|
27天前
|
安全 数据处理 Swift
深入探索iOS开发中的Swift语言特性
本文旨在为开发者提供对Swift语言在iOS平台开发的深度理解,涵盖从基础语法到高级特性的全面分析。通过具体案例和代码示例,揭示Swift如何简化编程过程、提高代码效率,并促进iOS应用的创新。文章不仅适合初学者作为入门指南,也适合有经验的开发者深化对Swift语言的认识。
45 9
|
22天前
|
vr&ar Android开发 iOS开发
安卓与iOS开发中的用户界面设计原则
【10月更文挑战第41天】探索移动应用开发的精髓,本文将深入分析安卓和iOS平台上用户界面设计的核心原则。通过比较两大操作系统的设计哲学,我们将揭示如何打造直观、易用且美观的应用程序界面。无论你是初学者还是资深开发者,这篇文章都将为你提供宝贵的见解和实用的技巧,帮助你在竞争激烈的应用市场中脱颖而出。
|
23天前
|
设计模式 Swift iOS开发
探索iOS开发:从基础到高级,打造你的第一款App
【10月更文挑战第40天】在这个数字时代,掌握移动应用开发已成为许多技术爱好者的梦想。本文将带你走进iOS开发的世界,从最基础的概念出发,逐步深入到高级功能实现,最终指导你完成自己的第一款App。无论你是编程新手还是有志于扩展技能的开发者,这篇文章都将为你提供一条清晰的学习路径。让我们一起开始这段旅程吧!