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. 剑指offer面试题6 重建二叉树(java)

    注:(1)java中树的构建 (2)构建子树时可以直接利用Arrays.copyOfRange(preorder, from, to),这个方法是左开右闭的 package com.xsf.SordF ...

  2. ios zxing扫码问题

    在ios 中 扫瞄二维码,条形码基本有 2中第三方的库,一个是zbar 一个是zxing,zxing 在android中表现的比较出色,但是在ios 中不是很好用,扫瞄效率低,我们一般都用zbar,但 ...

  3. Oracle中使用游标转换数据表中指定字段内容格式(拼音转数字)

    应用场景:将数据表TB_USER中字段NNDP的内容中为[sannanyinv]转换为[3男1女] 主要脚本:一个游标脚本+分割字符串函数+拼音转数字脚本 操作步骤如下: 1.创建类型 create ...

  4. UNIX网络编程——产生RST

    产生RST的3个条件:1. 建立连接的SYN到达某端口,但是该端口上没有正在监听的服务.   如:IP为192.168.1.33的主机上并没有开启WEB服务(端口号为0x50),这时我们通过IE去访问 ...

  5. DAA和CMAC

    数据认证算法(DAA)  Data Authentication Algorithm DAA建立在DES之上,该算法比较陈旧,人们已经发现了这个算法的安全弱点,目前已经被废止. DAA采用DES运算的 ...

  6. 精通CSS+DIV网页样式与布局--页面背景

    上篇博客,我们主要简单的总结了CSS的图片效果,我们这回来讲讲CSS如何对网页的背景进行设置,网页的背景是整个网页的重要组成部分,她直接决定了整个网页的风格和色调.这篇博客简单的总结一下如何用CSS来 ...

  7. Android官方命令深入分析之Device Monitor

    Android Device Monitor是一个提供了图形化界面的可以对Android应用进行调试和分析的独立的工具.Monitor工具不需要IDE环境,比如Android Studio.包括以下工 ...

  8. 海量数据挖掘MMDS week6: 支持向量机Support-Vector Machines,SVM

    http://blog.csdn.net/pipisorry/article/details/49445387 海量数据挖掘Mining Massive Datasets(MMDs) -Jure Le ...

  9. Windows7下使用mingw编译openssl

    Windows7下使用mingw编译openssl 首先参考这篇文章安装mingw/minsys: http://blog.csdn.net/ubuntu64fan/article/details/8 ...

  10. 一个CSS+jQuery的放大缩小动画效果

    日期: 2013年9月23日 作者:铁锚 // 今天帮朋友写了一些代码,自己觉得写着写着,好几个版本以后,有点满意,于是就贴出来. // 都是定死了的.因为需求就只有4个元素.如果是要用CSS的cla ...