1

sortedArray 包含 100 多个需要按“时间”键中的“小时”组织的对象。结果是有一个数组数组来填充表的各个部分并使用小时作为索引。“时间”的形式是 - 2012-05-15 07:20:00

NSInteger d = 0;
NSInteger prevd;
NSMutableArray *tempArray = [[NSMutableArray alloc] init];
detailArray = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i < 24; ++i)
    [detailArray addObject:[NSNull null]];

for (NSArray *item in sortedArray) {
    prevd = d;
    d = [[[[item objectAtIndex:0] objectForKey:@"time"] substringWithRange:NSMakeRange(11, 2)] intValue];
    if (d > prevd && prevd != 0) {
        [detailArray replaceObjectAtIndex:d withObject:tempArray];
        [tempArray removeAllObjects];
    }
    [tempArray addObject:item];
}

对象没有以正确的 detailArray 位置结束或根本没有结束。例如,[detailArray objectAtIndex:6]给出时间为 14(下午 2 点)的项目。

我错过了什么?

使用第一个答案编辑以更正代码。就是现在:

NSInteger d = 0;
NSInteger prevd;
NSMutableArray *tempArray = nil;
detailArray = [[NSMutableArray alloc] init];
for (NSInteger i = 0; i < 24; ++i)
    [detailArray addObject:[NSNull null]];

for (NSArray *item in sortedArray) {
    prevd = d;
    d = [[[[item objectAtIndex:0] objectForKey:@"time"] substringWithRange:NSMakeRange(11, 2)] intValue];
    if (d > prevd) {
        tempArray = NSMutableArray array];
        [detailArray replaceObjectAtIndex:d withObject:tempArray];
    }
    [tempArray addObject:item];
}
4

1 回答 1

3

你不能像这样重用 tempArray,你最终会得到包含多个条目的 detailArray,这些条目都指向同一个 tempArray 实例。(即每个有时间的时隙都将以最后一个时隙的数组结束)。

代替

[detailArray replaceObjectAtIndex:d withObject:tempArray];
[tempArray removeAllObjects];

你会想要的

tempArray = [NSMutableArray array];
[detailArray replaceObjectAtIndex:d withObject:tempArray];

这样每个时隙都有自己的数组。而且您还需要将 tempArray 的原始声明更改为

NSMutableArray *tempArray = nil;
于 2012-05-16T03:04:02.190 回答