使用NSDictionary对NSArray进行排序

时间:2011-07-06 09:35:43

标签: objective-c nsarray nsdictionary nssortdescriptor

我正在使用NSSortDiscriptors对NSArray进行排序。 数组中的每个索引都包含一个带键,值条目的字典。这本词典还包含另一本词典。

我想解决的问题是根据第一个字典上的值对数组进行排序,还要对它包含的字典中的某些值进行排序。

以下是我用于数组中其他值的排序方法。

- (void)sortArray {

if ([array count] != 0) {

    // Reports sortingDescriptors
    NSSortDescriptor * city = [[NSSortDescriptor alloc] initWithKey:@"City" ascending:YES];
    NSSortDescriptor * name = [[NSSortDescriptor alloc] initWithKey:@"Name" ascending:YES];
    NSSortDescriptor * country = [[NSSortDescriptor alloc] initWithKey:@"Country" ascending:YES];

    [reportsArray sortUsingDescriptors:[NSArray arrayWithObjects:city, name, country, nil]];

    [name release];
    [city release];
    [country release];
}
}

数组如下所示:

[{name = "";
city = "";
country = "";
date = {
 dateAdded = "";
 dateRemoved = "";
}
}];

所以我也想排序,如果在dateAdded上有值,例如。

4 个答案:

答案 0 :(得分:1)

您可以在创建NSSortDescriptor时指定关键路径,这样您就可以使用NSArrayNSDictionary进行排序。

答案 1 :(得分:0)

您可能想要检查字典是否包含类似的值:

// you can't set nil as a value for a key
if([yourDictionary objectForKey:@"yourKey"] == [NSNull null]) { ... }

然后你需要对剩余的对象进行排序,但是为了这样做,通过执行以下操作,在没有字典条目的情况下制作数组的副本:

NSMutableArray *tmpArray = [NSMutableArray arrayWithArray:firstArray];
[tmpArray removeObjectAtIndex:theIndexOfTheDictionary];
// sort your array, don't forget to catch the returned value
NSMutableArray *sortedArray = [tmpArray sortUsingDescriptors:[NSArray arrayWithObjects:city, name, country, nil]];
// finally, put the dictionary back in (if needed)
[sortedArray insertObject:theDictionary atIndex:theIndexYouWant];

答案 2 :(得分:0)

您是说数组中的对象具有City,Name和Country属性,还有字典属性,并且您想要对字典中的某个键进行排序?或者你是说数组中的条目是字典,但有时缺少城市,名称或国家/地区密钥?或者您是说某些条目是字典而某些是具有所列属性的对象?

在任何情况下,您都可以使用initWithKey:ascending:comparator:创建排序描述符,从而获得更大的灵活性。这允许您提供比较器块作为排序功能,它比直选器更灵活,例如

NSComparator mySort = ^(id obj1, id obj2)
{
    NSComparisonResult ret = NSOrderedSame;

    if ([obj1 isKindOfClass: [NSDictionary class]] && ![obj2 isKindOfClass: NSDictionary class]])
    {
        ret = NSOrderedAscending;
    }
    else if (![obj1 isKindOfClass: [NSDictionary class]] && [obj2 isKindOfClass: NSDictionary class]])
    {
        ret = NSOrderedDescending;
    }
    return ret;
};
NSSortDescriptor* descriptor = [[NSSortDescriptor alloc] initWithKey: @"self" ascending: YES comparator: mySort];

将为您提供一个排序描述符,对数组进行排序,然后将所有NSDictionaries放在第一位,然后放入其他对象。 (self是返回对象本身的所有NSObject所拥有的密钥。)

答案 3 :(得分:0)

NSArray *unsortedArray=[NSArray arrayWithObjects:[NSDictionary dictionaryWithObjectsAndKeys:@"anil",@"personInDictionary.lastName" ,nil],[NSDictionary dictionaryWithObjectsAndKeys:@"aneelu",@"personInDictionary.lastName", nil] ,[NSDictionary dictionaryWithObjectsAndKeys:@"kumar",@"anil.lastName", nil] ,nil];

 NSSortDescriptor * descriptor = [[[NSSortDescriptor alloc] initWithKey:@"personInDictionary.lastName"             ascending:YES] autorelease]; // 1

  NSArray * sortedArray = [unsortedArray sortedArrayUsingDescriptors:
                             [NSArray arrayWithObject:descriptor]];

 NSLog(@"sortedArray values %@",sortedArray);

  for (id object in [sortedArray valueForKey:@"personInDictionary.lastName"]) {

        NSLog(@"sortedArray value %@",object);
    }