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的了 :)

时间: 2024-11-16 04:12:30

objc写一个NSMutableArray不连续索引替换对象的方法的相关文章

java-如何调用一个定义在不同函数中对象的方法?

问题描述 如何调用一个定义在不同函数中对象的方法? 程序中有一个函数 startTimer, 我创建了一个 CountDownTimer 类中的实例: public void startTimer(View view){ CountDownTimer myTime = new CountDownTimer(300001000) { }} CountDownTimer有一个方法调用 cancel(),我想从一个不同的方法 resetTimer() 中调用. public void resetTim

求助C#写一个插件用来替换表的值

问题描述 有三张表,一张是城市表,一张是车类型表,还有一张表是综合表,不过综合表里的CityID和CarID是中文不是编号,我想读取那两张TXT表的数据,然后替换写入到综合表里,请问怎么写?求组 解决方案 解决方案二:尼玛问题描述能清楚一些么再说你代码不会写至少搞个什么伪代码之类的东东让大家看看吧表结构啥的都不说清楚编程不能懒惰解决方案三:是什么表,数据库的话,可以用触发器什么的.

手把手教你自己写一个js表单验证框架的方法_js面向对象

在表单程序中,在页面上需要很多的Js代码来验证表单,每一个field是否必须填写,是否 只能是数字,是否需要ajax到远程验证,blablabla. 如果一个一个单独写势必非常的繁琐,所以我们的第一个目标就是构建一个类似DSL的东西, 用表述的语句而非控制语句来实现验证. 其次一个个单独写的话还有一个问题就是必须全部验证通过才能提交,但是单独验证会因为 这个特征而增加很多额外的控制代码,且经常会验证不全面.所以第二个目标就是能够全面 的整合整个验证的过程. 最后不能是一个无法扩展的一切写死的实现

IBM中国研发中心面试题,如何用Java写一个程序达到对象深浅克隆的效果?不能用API

问题描述 IBM中国研发中心面试题,如何用Java写一个程序达到对象深浅克隆的效果?不能用API.来吧,大家发表意见,全分奉上. 问题补充:没人知道吗,能不能告诉我啊 解决方案 import java.io.ByteArrayInputStream;import java.io.ByteArrayOutputStream;import java.io.ObjectInputStream;import java.io.ObjectOutputStream;/** * 深/浅克隆 * * @auth

对象-java自己写一个按钮类问题

问题描述 java自己写一个按钮类问题 在一个java程序中,按钮有设置边框,透明,加图片,设置字体,设置背景颜色等行为,有多个按钮,如何写个按钮方法把这些行为写进去,调用的时候只要创建一个按钮对象就能将这么多行为包含进去 解决方案 直接用Java的awt库函数啊,用不着自己写,只要了解Java的按钮JButton,绑定事件处理函数. 解决方案二: 我觉得界面复制就好 不需要那么麻烦吧 解决方案三: 你可以写一个类继承java自己的JButton按钮,然后你把你想要的效果设为类的属性,你创建一个

写一个iOS复杂表单的正确姿势

前言 这几天项目的新需求中有个复杂的表单界面,在做的过程中发现要比想象中复杂很多,有好多问题需要处理.有很多东西值得写下来好好梳理下. 需求分析: 6创建网店1.png 上图便是UI根据需求给的高保真, 我们先根据这张图片来描述一下具体需求,明确一下我们都需要干些什么. 创建网店这个界面是一个复杂的表单,有"网店名称"."网店主标签"."网店简介"."网店地址"."网店座机"."email&quo

自写一个模仿Dictionary与Foreach的实现及心得总结_实用技巧

自己写一个类模仿Dictionary实现 a.自定义字典类MyDic 复制代码 代码如下: using System.Collections.Generic; namespace _10_自己写Dictionary { class KeyValuePair { public KeyValuePair() { } public KeyValuePair(string key, string value) { this.key = key; this.value = value; } private

只有20行Javascript代码!手把手教你写一个页面模板引擎

AbsurdJS 作者写的一篇教程,一步步教你怎样用 Javascript 实现一个纯客户端的模板引擎.整个引擎实现只有不到 20 行代码.如果你能从头看到尾的话,还能有不少收获的.你甚至可以跟随大牛的脚步也自己动手写一个引擎.以下是全文. 不知道你有木有听说过一个基于Javascript的Web页面预处理器,叫做AbsurdJS.我是它的作者,目前我还在不断地完善它.最初我只是打算写一个CSS的预处理器,不过后来扩展到了CSS和HTML,可以用来把Javascript代码转成CSS和HTML代

如何写一个框架(转)

  说明:作者也没写过什么框架,只是分享一些自己的理解,抛砖引玉罢了.如果你写过一些框架可能会产生一些共鸣欢迎讨论,如果你正在写或正打算写一个框架可能会给你一些启发.本文以为较长可能会分多个篇博客来写,现在能想到的是主要分为步骤.模式两部分.如果你觉得好,按一个推荐举手之劳让更多的人可以看到.   步骤   定位   所谓定位就是回答几个问题,我出于什么目的要写一个框架,我的这个框架是干什么的,有什么特性适用于什么场景,我的这个框架的用户对象是谁,他们会怎么使用,框架由谁维护将来怎么发展等等.