【问题标题】:How to create an NSArray of NSArray如何创建一个 NSArray 的 NSArray
【发布时间】:2013-09-02 21:57:17
【问题描述】:

我正在尝试根据 NSDictionary valueForKey: 第一个字母之一将一个 NSDictionaries 数组排序为一个字母化的数组数组

实际上我想要一些看起来像这样的东西

Array A // contains NSDictionaies with keyvalue MAF strings starting with A
 NSDictionary1
 NSDictionary2
 NSDictionary3
Array B // contains NSDictionaies with keyvalue MAF strings starting with B
 NSDictionary1
 NSDictionary2
 NSDictionary3
Array C // contains NSDictionaies with keyvalue MAF strings starting with C
 NSDictionary1
 NSDictionary2
 NSDictionary3
etc

所以我有一个字母数组,在每个字母数组中我想有一个 NSDictionary 值数组,keyValue MAF 的第一个字母应该匹配。

到目前为止,我有一个字典数组,我已经像这样排序了

NSSortDescriptor *sortDescriptor;
        sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"MAF"
                                                      ascending:YES];
        NSArray *sortDescriptors = [NSArray arrayWithObject:sortDescriptor];
        sortedDictionaryArray = [arrayData sortedArrayUsingDescriptors:sortDescriptors]; // use this in cellforrow: and didselectrow:

        NSLog(@"%@", sortedDictionaryArray); // this gives me a sorted array of NSdictionaries based off their MAF keyvalue.

这就是 NSDicitonary 的样子

HADM = 1;
ISLOT = 0;
ISVERT = 0;
MAF = "Yazot"; // keyvalue I am trying to work with.

然后我被卡住了,我不知道从这里去哪里。如果有人可以帮助我了解如何创建一个 NSArrays NSDictionaries 的 NSArray,那就太好了!希望我已经正确解释了我正在尝试做的事情,如果您需要更多详细信息,请告诉我,我会提供。

【问题讨论】:

  • 数据最初是什么样子的?只是一个数组中的一堆字典?
  • 是的,按 NSDictionary 对象的 MAF 键值中的字符串按字母顺序排序。
  • 它们需要在最终数组中排序吗?如果是这样,那么为什么不枚举初始列表,将它们放入每个字母数组中,然后分别对每个字母数组进行排序呢?如果不是,那么只需枚举,不要进行最后的排序。
  • 它们需要在最终实例中进行排序......它们在数组数组中的位置......好吧,现在去查找枚举,看看我能做什么。
  • 我遇到的问题是不知道检查字典键值的代码......或类似的东西。伙计,这要杀了我,哈哈

标签: ios objective-c nsarray nsdictionary


【解决方案1】:

此代码将首先使用分配给键 @"MAF" 的对象对您的字典数组进行排序。然后它将创建一个新的 Dictionary 并在其中为该字符串的每个第一个字母添加一个可变数组并将对象添加到其中。

NSArray *array = @[@{@"MAF": @"Yazot"}, @{@"MAF": @"Lorem"},@{@"MAF": @"Ipsum"}, @{@"MAF": @"Laura"},@{@"MAF": @"Isit"}];

NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
    return [obj1[@"MAF"] compare:obj2[@"MAF"]];
}];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

for (NSDictionary *dict in sortedArray) {
    NSString *firstLetter = [dict[@"MAF"] substringToIndex:1];

    if(![[dictionary allKeys] containsObject:firstLetter])
        dictionary[firstLetter] = [NSMutableArray array];

    [dictionary[firstLetter] addObject:dict];

}

如果你需要不区分大小写的字符串处理,“L”和“l”应该放在同一个数组中,这样做

NSArray *array = @[@{@"MAF": @"Yazot"}, @{@"MAF": @"Lorem"},@{@"MAF": @"Ipsum"}, @{@"MAF": @"Laura"},@{@"MAF": @"Isit"}];

NSArray *sortedArray = [array sortedArrayUsingComparator:^NSComparisonResult(NSDictionary *obj1, NSDictionary *obj2) {
    return [obj1[@"MAF"] caseInsensitiveCompare:obj2[@"MAF"]];
}];

NSMutableDictionary *dictionary = [NSMutableDictionary dictionary];

for (NSDictionary *dict in sortedArray) {
    NSString *firstLetter = [dict[@"MAF"] substringToIndex:1];
    firstLetter = [firstLetter lowercaseString];
    if(![[dictionary allKeys] containsObject:firstLetter])
        dictionary[firstLetter] = [NSMutableArray array];

    [dictionary[firstLetter] addObject:dict];

}

字典结果

{
    i =     (
                {
            MAF = Ipsum;
        },
                {
            MAF = Isit;
        }
    );
    l =     (
                {
            MAF = Laura;
        },
                {
            MAF = Lorem;
        }
    );
    y =     (
                {
            MAF = Yazot;
        }
    );
}

【讨论】:

  • 好的,很酷,现在先给出这个结果,然后将我的结果回复给您 :) 谢谢
  • 完美运行...非常感谢您的帮助!将阅读此内容进行更多调查并尝试为自己学习...显然我还有一些学习要做:P
【解决方案2】:

我们可以从创建字典数组的字典开始。

NSMutableDictionary *dictsForFirstLetter = [[NSMutableDictionary alloc] init];

for (NSDictionary *dict in arrayData) {
    NSString *dictMAF = dict[@"MAF"];
    NSString *firstLetter = [[dictMAF substringToIndex:1] uppercaseString];
    NSMutableArray *dicts = dictsForFirstLetter[firstLetter];
    if (!dicts) {
        dicts = [[NSMutableArray alloc] init];
        dictsForFirstLetter[firstLetter] = dicts;
    }
    [dicts addObject:dict];
}

然后你可以通过字典的MAF值的第一个字母来检索字典数组:

NSArray *dicts = dictsForFirstLetter[@"Y"];

要从中获取按字母顺序排列的数组,您可以对字典的键进行排序并枚举它们:

NSMutableArray *alphabetizedDicts = [[NSMutableArray alloc] init];

NSArray *firstLetters = [dictsForFirstLetter allKeys];
NSArray *sortedFirstLetters = [firstLetters sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];

for (NSString *firstLetter in sortedFirstLetters) {
    NSArray *dicts = dictsForFirstLetter[firstLetter];
    [alphabetizedDicts addObject:dicts];
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-19
    • 2013-07-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多