我正在使用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上有值,例如。
答案 0 :(得分:1)
您可以在创建NSSortDescriptor
时指定关键路径,这样您就可以使用NSArray
对NSDictionary
进行排序。
答案 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);
}