【问题标题】:Combine 100 NSMutableArrays into one controllable object将 100 个 NSMutableArray 组合成一个可控对象
【发布时间】:2013-02-06 21:17:09
【问题描述】:

好的,我基本上需要找到一种方法来更好地管理 100 个 NSMutableArrays 数据。

喜欢,(我实际上并没有这样做):

NSMutableArray *array1;
NSMutableArray *array2;
NSMutableArray *array3;
//etc..

我需要具有多个方面的东西,例如:

NSMutableCombinationArray *theMassiveArray;

[theMassiveArray addObject:theObject forArray:0 atIndex:0];

最后我想做这样的事情:

//in applicationdidfinishlaunching
loopCount = 0;


- (void) frameTimer:(NSTimer*)timer { //called every second

    startingValue = 0;

    for (int i = 1; i <= 100; i++)
    {
        NSString *dmxValues = [NSString stringWithFormat: @"%@,%@,%@,%@,%@", [DMXChannelArray objectAtIndex:startingValue], [DMXChannelArray objectAtIndex:startingValue+1], [DMXChannelArray objectAtIndex:startingValue+2], [DMXChannelArray objectAtIndex:startingValue+3], [DMXChannelArray objectAtIndex:startingValue+4]];

        [theMassiveArray addObject:dmxValues forArray:i-1 atIndex:loopCount];

        startingValue = startingValue + 5;
    }

    loopCount = loopCount + 1;

}

//NOTE DMXChannelArray is updated in another class with current DMX values from a controller.

所以DMX有512个通道,每个阵列需要容纳5个通道。这是一个记录应用程序,基本上以每秒一次的分辨率存储 500 个 DMX 通道值。

我该怎么做?最好的方法是什么?我显然想避免编写 100 个 NSMutableArrays 并手动完成。

作为参考,当录制结束时,用户选择他想要导出多少组(5 个通道),然后根据该数量,另一个 for 循环将通过 NSMutableCombinationArray 并导出最终数组。

【问题讨论】:

  • 一个建议是简单地将它们全部添加到字典中。然后,您可以为每个数组分配一个很好的人类可读键。如果您需要更改数组中的值,只需使用其键将其拉出,然后进行更改。或者,制作一个完全符合您要求的自定义对象。毕竟你是个程序员!
  • 在这种情况下,我需要为每一行 DMX 设置一个密钥吗?或者您可以将数据添加到特定键的对象而不是覆盖它吗?

标签: objective-c macos cocoa nsmutablearray


【解决方案1】:

编写一个包装类:

@interface MultiDimensionalMutableArray : NSObject

- (void)insertObject:(id)obj atIndex:(NSUInteger)idx intoArrayAtIndex:(NSUInteger)arrIdx;
- (id)objectAtIndex:(NSUInteger)idx inArrayAtIndex:(NSUInteger)arrIdx;

@end

@implementation MultiDimensionalMutableArray
{
    NSMutableArray * arrays;
}

- (id)init
{
    // init boilerplate

    arrays = [NSMutableArray arrayWithCapacity:100];
    for( int i = 0; i < 100; i++ ){
        [arrays addObject:[NSMutableArray array]];
    }

    return self;
}

- (void)insertObject:(id)obj atIndex:(NSUInteger)idx intoArrayAtIndex:(NSUInteger)arrIdx
{
    //TODO: Include appropriate bounds checking
    NSMutableArray * innerArray = [arrays objectAtIndex:arrIdx];
    [innerArray insertObject:obj atIndex:idx];
}

- (id)objectAtIndex:(NSUInteger)idx inArrayAtIndex:(NSUInteger)arrIdx
{
    return [[arrays objectAtIndex:arrIdx] objectAtIndex:idx];
}

@end

【讨论】:

  • 我认为这是最好的解决方案,下标是正确的做法
  • 太棒了!如何访问包装器的内容?
  • like - (void)getObjectatIndex:(NSUInteger)idx fromArrayAtIndex:(NSUInteger)arrIdx;
  • @objectiveccoder001:我现在无法解决这个问题,但我会在几个小时后回来。但是,它与 setter 方法相反:只需调用两次 objectAtIndex:,分别是外部数组和内部数组。
  • 是的,如果你有机会,那绝对是惊人的 :) 我一直在尝试弄乱它,但无济于事。
【解决方案2】:

这是你应该做的事情

NSMutableArray *massiveArray = [[NSMutableArray alloc] init];

for(int i=0; i<500; i+=5) {
    NSDictionary *dataDict = [[NSDictionary alloc] initWithObjectsAndKeys:[DMXChannelArray objectAtIndex:i], @"Key1", [DMXChannelArray objectAtIndex:i+1], @"Key2", [DMXChannelArray objectAtIndex:i+2], @"Key3", [DMXChannelArray objectAtIndex:i+3], @"Key4", [DMXChannelArray objectAtIndex:i+4], @"Key5", nil];
    [massiveArray addObject:dataDict];        
}

最后,massArray 包含 100 个字典,例如,要访问第 45 个字典的第二个值,您可以这样做:

NSString *value = [[massiveArray objectAtIndex:44] objectForKey:@"Key2"];

希望对你有帮助

【讨论】:

  • 我相信您缺少内部数组。 massArray 应该是一个或多个包含字典条目的数组。内部数组是必要的,因为字典需要重复插入到同一个数组中(每秒)。
  • 谢谢,我已经编辑了答案,循环现在从 0 运行到 500,增量为 5,并且 100 个字典中的每一个都包含 DMXChannelArray 中的 5 个连续项目。马上看?
  • 我认为你想要一个包含 100 个数组的顶级数组,每个数组可以有无限数量的字典(每个字典有 5 个条目)。 @josh 的回答对我来说是正确的参考。
【解决方案3】:

NSMutableDictionary *dict = [NSMutableDictionary alloc] initWithCapacity:100];
for(int i=1; i<=100; i++){
  NSString *dmxValues = [NSString stringWithFormat: @"%@,%@,%@,%@,%@", [DMXChannelArray objectAtIndex:startingValue], [DMXChannelArray objectAtIndex:startingValue+1], [DMXChannelArray objectAtIndex:startingValue+2], [DMXChannelArray objectAtIndex:startingValue+3], [DMXChannelArray objectAtIndex:startingValue+4]];
  [dict setObject:[NSArray arrayWithObject:dmxValues] forKey:[NSNumber numberWithInt:(i-1)];
}

检索您的值

[dic objectForkey:[NSNumber numberWithInt:array_index][array_element_index];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-01-04
    • 1970-01-01
    • 1970-01-01
    • 2016-11-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多