将顶点信息的NSString转换为多维数组 - 目标C.

时间:2012-02-15 09:28:33

标签: iphone objective-c nsstring nsarray

我有一个顶点信息的NSString,例如:

“0.943182 0.95878 0 0.853249 0.956043 0 0.795583 0.954268 0 0.738116 0.954268 0”

我需要在每个值之间添加逗号,将顶点分组为三个组,然后将三个值添加到数组中(然后我将添加到多维数组以与OpenGL ES一起使用)。

有人可以建议如何插入逗号并对数据进行分组吗?

谢谢!

3 个答案:

答案 0 :(得分:1)

相当简单:

打破字符串。

NSArray *nums = [theString componentsSeparatedByString:@" "];

Alloc / init一个将存储组的组数组。

NSMutableArray *groups = [NSMutableArray arrayWithCapacity:10];

循环遍历源字符串的组件,并将组","与它们分开。

NSUInteger basetIndex = 0;
NSString *str = @"";
for(baseIndex = 0; baseIndex < [nums count]; baseIndex += 3) {
    str = [str stringByAppendingFormat:@"%@,%@,%@", [nums objectAtIndex:baseIndex],
                                       [nums objectAtIndex:baseIndex+1],
                                       [nums objectAtIndex:baseIndex+2]];
    [groups addObject:str];
    str = @"";
    // or str = [NSString stringWithFormat:...] and no str = @""
}

在给定正确数量的数字的情况下,此代码将起作用,在其他情况下,您将检查组件的索引。

答案 1 :(得分:0)

而不是先将逗号插入字符串,而不是一步一步地扫描字符串:

NSString *str = @"0.943182 0.95878 0 0.853249 0.956043 0 0.795583 0.954268 0 0.738116 0.954268 0";
NSScanner *scanner = [NSScanner scannerWithString:str];
typedef struct { float x, y, z; } vertex;
while (YES) {
    vertex v;
    if (! ([scanner scanFloat:&v.x] && [scanner scanFloat:&v.y] && [scanner scanFloat:&v.z]))
        break;
    NSLog(@"%f, %f, %f", v.x, v.y, v.z);
    // put the vertex in some container
}

答案 2 :(得分:0)

请尝试以下解决方案。

NSString *str  = @"0.943182 0.95878 0 0.853249 0.956043 0 0.795583 0.954268 0 0.738116 0.954268 0";
NSArray *arr = [str componentsSeparatedByString:@" "];
NSUInteger cnt = 0;
NSMutableArray *multilist = [[NSMutableArray alloc] init];
NSString *temp = @"";
for (NSString *comp in arr ) {

    cnt++;
    if( cnt == 3 )
    {
        cnt = 0;
        temp = [temp stringByAppendingFormat:@"%@" ,comp];
        [multilist addObject:temp];
        temp = @"";
    }
    else
    {
        temp = [temp stringByAppendingFormat:@"%@ ," ,comp];
    }
}
NSLog(@"%@",multilist);
[multilist release];