NSMutableArray只保留最后一次循环迭代的值?

时间:2012-08-27 14:56:26

标签: objective-c nsarray nsdictionary

我正在尝试索引UITableView来查看朋友的名字,所以我有一个NSArray所有朋友的名字,来自AZ,我现在所做的就是计算朋友的数量对于每个字母,例如:A = 20,B = 15,依此类推,并将这些计数放在NSArray中。

我现在需要做的是尝试将每个名称都放在数组中(示例A字母),然后将此数组存储在NSMutableDictionary中,如下所示:

A =         (
        Ali,
        Alaa,
        Asdsd,
        Awer,
        asdft
    );

和其余的字母也像'A'一样。

因为我知道每个字母的名称大小(self.charcherSize中的大小)以下是我的代码,指定每个名称属于特定字母并将其添加到NSMutableArray“名称”中以及之后从该信函组完成,将该组添加到NSMutableDictionary“行”,然后将其添加到NSMutableArray“内容”中:

NSMutableArray *content = [NSMutableArray array];
NSMutableDictionary *row = [NSMutableDictionary dictionary];

int startPoint = 0;
for(int i = 0; i < [self.charcherSize count]; i++)
{
    NSMutableArray *names = [NSMutableArray array];
    NSInteger max = [[self.charcherSize objectAtIndex:i] integerValue] + startPoint;

    for (int j = startPoint; j < max; j++) {
        NSDictionary *dic = [self.friendsInfo objectAtIndex:j];

        [names addObject:[dic objectForKey:@"name"]];
    }
    [row setValue:names forKey:charcher];
    [content addObject:row];
    startPoint = max;
}

但问题是NSMutableArray“内容”只保留最后一个字母的值并将这些值复制到所有字典的值,如下所示:

(
    {
    "A" =         (
        "Zzz",
        "Zzz1",
        "Zzz2",
    );
},
    {
    "B" =         (
        "Zzz",
        "Zzz1",
        "Zzz2",
    );
},
    {
    "C" =         (
        "Zzz",
        "Zzz1",
        "Zzz2",
    );
},

2 个答案:

答案 0 :(得分:2)

我不确定你在尝试使用characterSize和计数,我认为更简单的方法是创建一个可变字典,而不是一个可变数组,因为你的数组只包含一个对象,一本字典。所以我会这样做(假设friendsInfo是一个名字数组):

NSMutableDictionary *indexed = [NSMutableDictionary dictionary];
for (NSString *aName in friendsInfo){
    if (![[indexed allKeys] containsObject:[aName substringToIndex:1]]) {
        [indexed setObject:[NSMutableArray arrayWithObject:aName] forKey:[aName substringToIndex:1]];
    }else{
        [[indexed valueForKey:[aName substringToIndex:1]] addObject:aName];

    }
}
    NSLog(@"%@",indexed);

答案 1 :(得分:0)

你似乎选择了一种相当复杂的方式来做到这一点。我会查看NSPredicate类(例如BEGINSWITH谓词),然后使用[NSArray filteredArrayUsingPredicate]方法生成每个字母都带有名称的数组。