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不连续索引替换对象的方法的更多相关文章

  1. python练习题-写一个函数,打印所有包含copy方法的内置对象

    代码: #encoding=utf-8for i in dir(__builtins__):    #print "i:",i    try: #这里的i是个字符串,并不能直接用d ...

  2. 原生写一个一键获取所有DOM元素的方法

    一天挺一个朋友去面试要做一个获取dom元素到数组中 主要用到一个递归算法,通过节点的childNodes属性--代码如下: function getAllNode() { var nodes = do ...

  3. 微信小程序 写一个获取验证码 及setInterval 使用基本方法

    <!--index.wxml--> <view class="container"> <view class="container_cont ...

  4. javascript原型:写一个合并后数组去掉同类项的方法

    <!DOCTYPE html> <html> <head> <title>test013_Array_prototype_unique()</ti ...

  5. 手写一个React-Redux,玩转React的Context API

    上一篇文章我们手写了一个Redux,但是单纯的Redux只是一个状态机,是没有UI呈现的,所以一般我们使用的时候都会配合一个UI库,比如在React中使用Redux就会用到React-Redux这个库 ...

  6. 都是用 DllImport?有没有考虑过自己写一个 extern 方法?

    你做 .NET 开发的时候,一定用过 DllImport 这个特性吧,这货是用于 P/Invoke (Platform Invoke, 平台调用) 的.这种 DllImport 标记的方法都带有一个 ...

  7. 用java代码写一个简单的网上购物车程序

    需求:1.写一个商品类,有商品编号.商品名称.商品分类.商品单价属性.2.写一个商品条目信息类,有商品和数量两个属性,有商品总价格方法. 3.写一个购物车类,有添加商品方法.查看订单信息,删除商品,修 ...

  8. 如何用 Python 写一个简易的抽奖程序

    不知道有多少人是被这个头图骗进来的:) 事情的起因是这样的,上周有同学问小编,看着小编的示例代码敲代码,感觉自己也会写了,如果不看的话,七七八八可能也写的出来,但是一旦自己独立写一段程序,感觉到无从下 ...

  9. 利用Python写一个抽奖程序,解密游戏内抽奖的秘密

    前言 本文的文字及图片来源于网络,仅供学习.交流使用,不具有任何商业用途,版权归原作者所有,如有问题请及时联系我们以作处理. 作者: 极客挖掘机 PS:如有需要Python学习资料的小伙伴可以加点击下 ...

随机推荐

  1. android 网络工具 之Android-Volley的demo

    1.今天详细的研究了Volley的使用,下面来给大家介绍一下: Android Volley 是Google开发的一个网络lib,可以让你更加简单并且快速的访问网络数据.Volley库的网络请求都是异 ...

  2. How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer

    How to generate the complex data regularly to Ministry of Transport of P.R.C by DB Query Analyzer 1 ...

  3. 【移动开发】binder阻塞/非阻塞与单向/双向的问题

    The client thread calling transact is blocked by default until onTransact has finishedexecuting on t ...

  4. Cocos2D iOS之旅:如何写一个敲地鼠游戏(九):创建动画

    大熊猫猪·侯佩原创或翻译作品.欢迎转载,转载请注明出处. 如果觉得写的不好请告诉我,如果觉得不错请多多支持点赞.谢谢! hopy ;) 免责申明:本博客提供的所有翻译文章原稿均来自互联网,仅供学习交流 ...

  5. Java采用JDBC的方式连接Hive(SparkSQL)

    前两天,由于系统的架构设计的原因,想通过Java直接访问Hive数据库,对于我这个Java以及Hadoop平台的菜鸟来说,的确是困难重重,不过,还好是搞定了.感觉也不是很麻烦.这篇文章,作为一个感想记 ...

  6. 使用VideoView实现简单视频播放器

    转载请注明出处:http://blog.csdn.net/hejjunlin/article/details/39471397 VideoView内部封装好了Mediaplayer.Android框架 ...

  7. 最简单的基于FFmpeg的AVDevice例子(读取摄像头)

    =====================================================最简单的基于FFmpeg的AVDevice例子文章列表: 最简单的基于FFmpeg的AVDev ...

  8. UNIX环境高级编程——计算机体系结构基础知识

    无论是在CPU外部接总线的设备还是在CPU内部接总线的设备都有各自的地址范围,都可以像访问内存一样访问,很多体系结构(比如ARM)采用这种方式操作设备,称为等都会产生异常. 通常操作系统把虚拟地址空间 ...

  9. Mybatis事务(二)事务隔离级别

    一般数据库的隔离级别有4个,由低到高依次为Read uncommitted.Read committed.Repeatable read.Serializable,这四个级别可以逐个解决脏读.不可重复 ...

  10. OTA和Recovery系统升级流程介绍

    本文介绍了Android原生OTA和Recovery升级过程步骤. 进入升级 - 1.1 正常启动和进入Recovery的区别 下面给出了升级流程的简单示意图.  上图中的上下两个部分,上面一部分是正 ...