通过循环对NSArray进行分组?

时间:2013-10-23 22:02:44

标签: ios objective-c arrays sorting

我正在尝试隔离数组中的元素。我有一个包含超过100000个NSNumber对象的NSArray。我遇到的问题是它们以3的增量排列。

processarray = [[NSMutableArray alloc] init];

for (loopstart = 0; loopstart < arraycount; loopstart ++)

{
    arrayvalue = [[mesharray objectAtIndex: loopstart] floatValue];
    coordinate = [NSNumber numberWithFloat: arrayvalue];
    [processarray addObject: coordinate];
    [printgcodetoconsole appendFormat: @"\nCOORDINATE: %@", coordinate];

}

例如,我的数组如下所示:

  • COORDINATE:5567
  • COORDINATE:1065
  • COORDINATE:1564
  • COORDINATE:3432
  • COORDINATE:6123
  • COORDINATE:9345
  • COORDINATE:1856
  • COORDINATE:2765
  • COORDINATE:1998
  • COORDINATE:9087
  • COORDINATE:2234
  • COORDINATE:5467

我需要的是一种根据X,Y和Z将正确值组合在一起的方法,因为它们是空间中的点,如:

  • NEW ARRAY OBJECT:(X5567,Y1065,Z1564)

依旧......

除了它们都是NSNumber对象之外,数组中的对象之间没有相似之处。

提前致谢!

我目前正在NSTextView中将此数组作为字符串打印,我无法弄清楚如何在不使用此代码搞乱循环的情况下隔离字符串:

[printgcodetoconsole appendFormat: @"\nCOORDINATE: %@", coordinate];

我真的更喜欢更喜欢的东西:

NSNumber * X;
NSNumber * Y;
NSNumber * Z;

[printgcodetoconsole appendFormat: @"\n X%@, Y%@, Z%@", X, Y, Z];

3 个答案:

答案 0 :(得分:1)

您应该检查计数器loopstart何时是3的倍数并将子组上的最后3个值分组:

NSMutableArray *subArray = [NSMutableArray array];
for (loopstart = 0; loopstart < arraycount; loopstart ++) {
    arrayvalue = [[mesharray objectAtIndex:loopstart] floatValue];
    coordinate = [NSNumber numberWithFloat: arrayvalue];
    [subArray addObject:coordinate];
    if (loopstart % 3 == 0) {
        [processarray addObject:subArray];
        subArray = [NSMutableArray array];
    }
}

答案 1 :(得分:0)

这个简单的代码将从meshArray中获取每三个项目,将它们放入一个新数组并将其插入一个更大的数组中(这样你就有了一个数组数组)。

NSArray *meshArray = /* obtain from somewhere */;
NSAssert(([meshArray count] % 3) == 0, @"Array does not contain multiple of 3");

NSMutableArray coordinates = [NSMutableArray array];

for (NSUInteger i = 0; i < [meshArray count]; i += 3)
    [coordinates addObject:[meshArray subarrayWithRange:NSMakeRange(i, 3)]];

或者,如果您愿意,可以使用字典键入它们:

NSArray *meshArray = /* obtain from somewhere */;
NSAssert(([meshArray count] % 3) == 0, @"Array does not contain multiple of 3");

NSMutableArray coordinates = [NSMutableArray array];

for (NSUInteger i = 0; i < [meshArray count]; i += 3)
{
    NSDictionary *coordinate = @{ @"X" : meshArray[i], @"Y" : meshArray[i + 1], @"Z" : meshArray[i + 2] };
    [coordinates addObject:coordinate];
}

答案 2 :(得分:0)

非常感谢...答案结果证明是JeroValli关于使用模数的想法的变体。我可能会添加一个该死的性感主意。谢谢Jero和其他所有人。

for (loopstart = 0; loopstart < arraycount; loopstart ++)

        {
            arrayvalue = [[mesharray objectAtIndex: loopstart] floatValue];
            point = [NSNumber numberWithFloat: arrayvalue];
            [coordinates addObject: point];
            if (loopstart % 3 == 0)
            {
                [printgcodetoconsole appendFormat: @"\nCOORDINATE: X%@", point];
            }
            else if (loopstart % 3 == 1)
            {
                [printgcodetoconsole appendFormat: @"\nCOORDINATE: Y%@", point];
            }
            else if (loopstart % 3 == 2)
            {
                [printgcodetoconsole appendFormat: @"\nCOORDINATE: Z%@", point];
            }