Ios 如何从字典数组创建indexPath

Ios 如何从字典数组创建indexPath,ios,nsarray,nsdictionary,Ios,Nsarray,Nsdictionary,好的,我正在尝试从NSDictionary值的NSArray中创建一个indexPath值,这样当我进入我的tableview时,我可以在旁边放置一个附件勾号 我有一个NSArray的nsdictionary如下所示 { HAS = 1; ISL = 1; ISV = 0; MAN = BANKING; MON = 324; } 因此,该数组将包含大约80个这些条目,每个条目都有不同的值 要创建IndexPath,

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

我有一个
NSArray
nsdictionary
如下所示

{
        HAS = 1;
        ISL = 1;
        ISV = 0;
        MAN = BANKING;
        MON = 324;
}
因此,该数组将包含大约80个这些条目,每个条目都有不同的值

要创建IndexPath,我需要计算MAN的唯一首字母的数量,直到MAN==selected String这将给出节号

然后我需要计算行的所选节类型中有多少个条目

我已经从这里得到了一些帮助,但是我没有发现我的逻辑中的一个缺陷。。对于行,我计算所有的实体,而不是从所选部分开始计算,因为我的行数完全填满了。下面是我试图实现的一个例子

a, aa, b, c, d, dd, ddd, dddd, e, f, g, gg
用户选择ddd,这样indexpath将

部分

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

我可以像这样把这部分做好

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);
    }
}
NSArray*MANArray=[sortedArray valueForKey:@“MAN”];
NSMutableArray*字母=[NSMutableArray];
NSString*currentLetter=nil;
for(管理区中的NSString*字符串){
如果(string.length>0){
NSString*字母=[string substringToIndex:1];
if(![letter IsequalString:currentLetter]){
[字母addObject:letter];
currentLetter=字母;
}
}
}
NSArray*firstLetterArray=[NSArray数组带数组:字母];
int sectionCount=0;

对于(int i=0;i,您可以使用字典原始数组上的谓词筛选出以特定字母开头的所有字典,然后使用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;
    }
}];

如何将值为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 allkey]count]
应给出节计数,
[[dict valueForKey:@“d”]count]
应给出相应的行计数

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

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];

我使用两个并行结构的数组。 以下是我的代码,用于在其中一个中生成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
    })

啊..好吧,等我开始玩的时候,我会回来标记你的答案。好吧..我的错我忘了人可以有多个相同的实例..区分它们的方法是使用MON作为唯一标识符…我知道。我已经用我创建的函数更新了我的问题,以计算到选定的值你可以连接MAN+MON并创建这些字符串的数组。然后使用上面相同的谓词对其进行过滤。以某种方式创建一个字典数组而不是仅仅为filteredWords创建一个数组怎么样?你知道怎么做吗?我仍在努力解决这个问题。出于某种原因,我认为我没有正确地执行谓词当我过滤字典时,数组中没有对象…hrmm或者它应该是一个可变数组?由于字典键未排序,您将遇到获取sectionCount的问题。要使用此方法,您还需要维护键的有序列表(如原始代码)或者使用一个维护顺序的自定义字典类。现在就来试试。我已经对字典数组进行了排序,希望这能起作用。@HurkNburkS,我已经检查了你问题中的数组字符串,在我看来它似乎能起作用。检查一下,让我知道。@HurkNburkS,“ddd”的节数和行数应计算为,int sectionCount=[[dict allKeys]indexOfObject:@“d”];int rowCount=[[dict valueForKey:@“d”]indexOfObject:@“ddd”];更正了我的答案。totalSectionCount和totalRowCount可以用来绘制包含节和行的表格。这非常接近于工作。但它只是给了我一个稍微不正确的行计数。我想它可能是从1或什么开始的。而不是0。只是尝试跟踪它。
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);
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];
    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
    })