objc写一个NSMutableArray不连续索引替换对象的方法
NSMutableArray内置的方法-(void)replaceObjectsAtIndexes:(NSIndexSet*)set withObjects:(NSArray*)objs
只能替换一段连续索引内的对象,比如2 to 10之间的对象,如果我想要替换1,3,5索引位置的对象需要自己写代码。
在ruby中对于数组对象有一个values_at方法可以取得不连续索引的对象:
2.2.1 :048 > ary = %w[a b c d e f g]
=> ["a", "b", "c", "d", "e", "f", "g"]
2.2.1 :049 > ary.values_at(*[1,3,5])
=> ["b", "d", "f"]
如果是替换不连续索引的对象,稍微麻烦点:
2.2.1 :053 > idxes
=> [1, 3, 5]
2.2.1 :054 > objs
=> ["X", "X", "X"]
2.2.1 :055 > idxes.zip(objs)
=> [[1, "X"], [3, "X"], [5, "X"]]
2.2.1 :056 > idxes.zip(objs).each {|i,v|ary[i] = v}
=> [[1, "X"], [3, "X"], [5, "X"]]
2.2.1 :057 > ary
=> ["a", "X", "c", "X", "e", "X", "g"]
如果idxes数量小于objs则忽略多余的对象,反之如果idxes数量大于objs则用nil补足:
2.2.1 :062 > objs = %w[X X X]
=> ["X", "X", "X"]
2.2.1 :063 > idxes = [1,6]
=> [1, 6]
2.2.1 :064 > idxes.zip(objs).each {|i,v|ary[i] = v}
=> [[1, "X"], [6, "X"]]
2.2.1 :065 > ary
=> ["a", "X", "c", nil, "e", nil, "X"]
2.2.1 :059 > objs = []
=> []
2.2.1 :060 > idxes.zip(objs).each {|i,v|ary[i] = v}
=> [[1, nil], [3, nil], [5, nil]]
2.2.1 :061 > ary
=> ["a", nil, "c", nil, "e", nil, "g"]
下面写一个objc中类似的实现:
#import <Foundation/Foundation.h>
@interface NSMutableArray (HyRandReplace)
@end
@implementation NSMutableArray (HyRandReplace)
-(void)replaceObjectsAtIndexesRand:(NSArray*)idxes withObjects:(NSArray*)objs{
NSUInteger count_idxes = [idxes count];
//NSUInteger count_objs = [objs count];
for(NSUInteger i = 0;i < count_idxes;i++){
NSUInteger x = [idxes[i] intValue];
@try{
[self replaceObjectAtIndex:x withObject:objs[i]];
}
@catch(NSException *e){
NSLog(@"%@:%@",e.name,e.reason);
[self replaceObjectAtIndex:x withObject:[NSNull null]];
}
}
}
@end
int main(void){
@autoreleasepool{
NSArray *idxes = @[@1,@3,@5];
//NSArray *objs = @[@"LOVE",@"FOR"];
NSArray *objs =@[];
NSMutableArray *mary = [@[@"a",@"and",@"b",@"for",@"ever",@"..."]
mutableCopy];
NSLog(@"%@",mary);
[mary replaceObjectsAtIndexesRand:idxes withObjects:objs];
NSLog(@"%@",mary);
}
return 0;
}
当然ruby里也可以做类似的操作,why not?ruby比objc还要动态:
2.2.1 :066 > class Array
2.2.1 :067?> def replace_rand(idxes,objs)
2.2.1 :068?> idxes.zip(objs).each {|i,v|self[i] = v}
2.2.1 :069?> end
2.2.1 :070?> end
=> :replace_rand
2.2.1 :073 > ary
=> ["a", "b", "c", "d", "e", "f", "g"]
ary.replace_rand
2.2.1 :074 > ary.replace_rand(idxes,objs)
=> [[1, "X"], [6, "X"]]
2.2.1 :075 > ary
=> ["a", "X", "c", "d", "e", "f", "X"]
see!ruby扩展类要比objc简单的多,所以看swift的了 :)
objc写一个NSMutableArray不连续索引替换对象的方法的更多相关文章
- python练习题-写一个函数,打印所有包含copy方法的内置对象
代码: #encoding=utf-8for i in dir(__builtins__): #print "i:",i try: #这里的i是个字符串,并不能直接用d ...
- 原生写一个一键获取所有DOM元素的方法
一天挺一个朋友去面试要做一个获取dom元素到数组中 主要用到一个递归算法,通过节点的childNodes属性--代码如下: function getAllNode() { var nodes = do ...
- 微信小程序 写一个获取验证码 及setInterval 使用基本方法
<!--index.wxml--> <view class="container"> <view class="container_cont ...
- javascript原型:写一个合并后数组去掉同类项的方法
<!DOCTYPE html> <html> <head> <title>test013_Array_prototype_unique()</ti ...
- 手写一个React-Redux,玩转React的Context API
上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...
- 都是用 DllImport?有没有考虑过自己写一个 extern 方法?
你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的.这种 DllImport 标记的方法都带有一个 ...
- 用java代码写一个简单的网上购物车程序
需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法. 3.写一个购物车类,有添加商品方法.查看订单信息,删除商品,修 ...
- 如何用 Python 写一个简易的抽奖程序
不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...
- 利用Python写一个抽奖程序,解密游戏内抽奖的秘密
前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...
随机推荐
- SQLite 运算符(http://www.w3cschool.cc/sqlite/sqlite-operators.html)
SQLite 运算符 SQLite 运算符是什么? 运算符是一个保留字或字符,主要用于 SQLite 语句的 WHERE 子句中执行操作,如比较和算术运算. 运算符用于指定 SQLite 语句中的条件 ...
- Android简易实战教程--第二十九话《创建图片副本》
承接第二十八话加载大图片,本篇介绍如何创建一个图片的副本. 安卓中加载的原图是无法对其修改的,因为默认权限是只读的.但是通过创建副本,就可以对其做一些修改,绘制等了. 首先创建一个简单的布局.一个放原 ...
- Android简易实战教程--第十九话《手把手教您监听EditText文本变化,实现抖动和震动的效果》
昨晚写博客太仓促,代码结构有问题,早上测试发现没法监听文本变化!今日更改一下.真心见谅啦,哈哈!主活动的代码已经改好了,看截图这次的确实现了文本监听变化情况. 监听文本输入情况,仅仅限于土司略显low ...
- PLSQL解析XML文件
参考网上资料学习汇总 在PL/SQL中利用XML ,Oracle提供了几个组件,让开发人员能轻松地利用XML技术.这些组件包括: 1. XML 分析程序.即用来分析.构造和验证XML文档.. ...
- 精通CSS+DIV网页样式与布局--CSS段落效果
在上一篇博文中,小编主要详细的介绍了CSS是如何控制文字的显示效果,随着需求的不断变更,那么我们如何对段落进行相关操作,以达到我们想要的效果呢,接下来,为了需要,小编继续来完善CSS对段落的控制的显示 ...
- Android进阶(三)android httpClient 支持HTTPS的访问方式
项目中Android https请求地址遇到了这个异常(无终端认证): javax.net.ssl.SSLPeerUnverifiedException: No peer certificate 是S ...
- qualcomm memory dump 抓取方法
Memory dump是系统出现crash时常用的分析故障原因的方法,qualcomm 各子系统运行时,为方便debug,都会开辟ram log和debug variable用于保存各系统运行信息及健 ...
- C语言中的内存分配
对于一个C语言程序而言,内存空间主要由以下几个部分组成: 1)程序代码区:用来存储程序的二进制代码 2)全局区/静态存储区 3)BSS段:用来存储未初始化的全局变量和静态变量. 4)栈区:存储局部变量 ...
- Dynamics CRM 导入用户数据错误 could not retrieve salesperson role
在CRM中通过导入数据的方式创建用户时报下图中的错误,"could not retrieve saleperson role".原因是系统中的自带的salesperson安全角色被 ...
- UNIX环境高级编程——UNIX基础知识
1.用户在登陆linux系统时,先键入登录名,然后键入口令.系统在其口令文件(通常是/etc/passwd文件)中查看登录名.口令文件中的登陆项由7个以冒号分隔的字段组成,它们是:登录名.加密口令.数 ...