如何从字典的NSArray创建indexPath

时间:2012-11-07 01:56:34

标签: ios nsarray nsdictionary

好的,我正在尝试从NSArray NSDictionary个值创建一个indexPath值,这样当我进入我的tableview时,我可以在旁边放置一个附件。

我有NSArray NSDictionaries看起来像这样

{
        HAS = 1;
        ISL = 1;
        ISV = 0;
        MAN = BANKING;
        MON = 324;
}

因此,数组中大约有80个条目各有不同的值。

要创建IndexPath,我需要计算 MAN 的唯一首字母数,直到 MAN == selected String 这将为我提供章节编号。

然后我需要计算所选部分类型中行数的条目数。

我已经从这里获得了一些帮助,但我没有发现我的逻辑中的一个缺陷...因为我计算所有的entires而不是从所选部分的开头计算我的行计数完全填充。下面是我想要实现的一个例子。

a, aa, b, c, d, dd, ddd, dddd, e, f, g, gg

用户选择ddd,因此indexpath将是

部分

a, b, c, (d), e, f, g = 3

d, dd, (ddd), dddd = 2

我可以把这个部分搞得很好

NSArray *MANArray = [sortedArray valueForKey:@"MAN"];

NSMutableArray *letters = [NSMutableArray array];
NSString *currentLetter = nil;
for (NSString *string in MANArray) {
    if (string.length > 0) {
        NSString *letter = [string substringToIndex:1];
        if (![letter isEqualToString:currentLetter]) {
            [letters addObject:letter];
            currentLetter = letter;
        }
    }
}
NSArray *firstLetterArray = [NSArray arrayWithArray:letters];
int sectionCount = 0;
for(int i=0; i<[firstLetterArray count]; i++){
    if( [[firstLetterArray objectAtIndex:i] isEqualToString:completedStringLetter]){
        sectionCount = i;
        NSLog(@"%d", sectionCount);
    }
}

但是当我试图从所选部分获取行数时,我只是陷入困境。

任何帮助都会非常感激。

更新

这是我所做的事情,直到所选的值,但我说它不正确,因为它需要从该部分开始,取决于第一个字母。

NSNumber * myNumber = [NSNumber numberWithInteger:[modIdString integerValue]];

//                
NSArray *subarray = [sortedArray valueForKey:@"MOD"];
for(int i=0; i<[subarray count]; i++){
   if( [[subarray objectAtIndex:i] isEqualToNumber:myNumber]){
      //you have found it, do whatever you need, and break from the loop
      modelResultIndexPath = nil;
      modelResultIndexPath = [NSIndexPath indexPathForRow:sectionCount inSection:i];
   }
}

3 个答案:

答案 0 :(得分:2)

如何将值为"a, aa, b, c, d, dd, ddd, dddd, e, f, g, gg"的数组转换为NSDictionary数组,

dict = {
        a = [a, aa];
        b = [b];
        c = [c];
        d = [d, dd, ddd, dddd];
        e = [e];
        f = [f];
        g = [g, gg];
}

然后[[dict allKeys] count]应该为您提供部分计数,[[dict valueForKey:@"d"] count]应该给出相应的行数。

要将数组转换为字典数组,请使用此code

NSArray *sortedArray = [arrayData sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
NSMutableDictionary *arraysByLetterDict = [NSMutableDictionary dictionary];

for (NSString *value in sortedArray) {
    NSString *firstLetter = [value substringWithRange:NSMakeRange(0, 1)];
    NSMutableArray *arrayForLetter = [arraysByLetterDict objectForKey:firstLetter];
    if (!arrayForLetter) {
        arrayForLetter = [NSMutableArray array];
        [arraysByLetterDict setObject:arrayForLetter forKey:firstLetter];
    }
    [arrayForLetter addObject:value];
}
NSLog(@"Dictionary: %@", arraysByLetterDict);

Indexpath可以计算为,

NSArray *allKeys = [[dict allKeys] sortedArrayUsingSelector:@selector(localizedCaseInsensitiveCompare:)];
int totalSectionCount = [allKeys count];
int totalRowCount = [[dict valueForKey:@"d"] count];

int sectionCount = [allKeys indexOfObject:@"d"];
int rowCount = [[dict valueForKey:@"d"] indexOfObject:@"ddd"];

modelResultIndexPath = [NSIndexPath indexPathForRow:rowCount inSection:sectionCount];

答案 1 :(得分:0)

您可以在原始字典数组上使用谓词来过滤掉所有以特定字母开头的字典,然后使用idexOfObjectPassingTest找到您要查找的匹配字典的索引:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF.MAN beginswith[c] '%@'", SELECTED_FIRST_LETTER_OF_MAN];
NSArray *filteredDictionaries = [sortedArray filteredArrayUsingPredicate:predicate];
int rowCount = [filteredDictionaries indexOfObjectPassingTest:^BOOL(id obj, NSUInteger idx, BOOL *stop) {
    NSDictionary *dictionary = (NSDictionary *)obj;

    if ([dictionary[@"MAN"] isEqualToString:SELECTED_MAN]
        && [dictionary[@"MON"] isEqualToString:SELECTED_MON]) {
        return YES;
    } else {
        return NO;
    }
}];

答案 2 :(得分:0)

我正在使用两个具有并行结构的数组。 这是我在一个中生成indexPath的代码,用于另一个:

    var sectionCounter = 0
    var itemsCounter = 0
    stopIdsArray.map({
        $0.map( {
            let indexPath = IndexPath(item:itemsCounter,section:sectionCounter)
            NetworkManager.sharedInstance.getData(stop:$0,indexPath:indexPath)
            itemsCounter += 1
        })
        itemsCounter = 0
        sectionCounter += 1
    })