如何将对象的 NSArray 排序为字母 NSDictionary?
How to sort an NSArray of Objects to alphabetic NSDictionary?
我有一个名为 Receipt
的自定义 class。它有另一个 class 的 属性,叫做 Retailer
。 Retailer
还有一个 属性 叫做 retailerName
。
我得到一个 Receipt
对象数组。我希望它被排序为 NSDictionary
,其键将是字母,值将是 Receipt
的数组,其 Retailer
对象的 retailerName
以字母开头,数组是按字母顺序排序。
我有:
[
{
"retailerName": "Adidas",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Book My Show",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Albert-Heijn",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Amazon",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "BlackBerry",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lambhorgini",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lewis Outlet",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Boston Store",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lidl",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
]
我需要的是:
{
"A": [
{
"retailerName": "Adidas",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Albert-Heijn",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Amazon",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
],
"B": [
{
"retailerName": "BlackBerry",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Book My Show",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Boston Store",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
],
"L": [
{
"retailerName": "Lambhorgini",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lewis Outlet",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lidl",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
]
}
我知道情况有点复杂,但我已尽力解释清楚。如果需要,请寻求进一步的解释。
提前致谢。
Array = [Array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
NSNumber *number1 = [NSNumber
numberWithFloat:[someValue floatValue]];
NSNumber *number2 = [NSNumber
numberWithFloat:[[somevalue floatValue]];
return [number2 compare:number1];
}];
您可以选择字典中的特定键并尝试对其进行排序
我解决了我的问题:
这是我所做的:
@implementation NSMutableDictionary (DictionaryForSectionIndex)
+(NSMutableDictionary *)createDictionaryForSectionIndex:(NSArray *)array
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (char firstChar = 'a'; firstChar <= 'z'; firstChar++)
{
//NSPredicates are fast
NSString *firstCharacter = [NSString stringWithFormat:@"%c", firstChar];
NSArray *content = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"retailerName beginswith[cd] %@", firstCharacter]];
NSMutableArray *mutableContent = [NSMutableArray arrayWithArray:content];
if ([mutableContent count] > 0)
{
NSString *key = [firstCharacter uppercaseString];
[dict setObject:mutableContent forKey:key];
}
}
return dict;
}
@end
我有一个名为 Receipt
的自定义 class。它有另一个 class 的 属性,叫做 Retailer
。 Retailer
还有一个 属性 叫做 retailerName
。
我得到一个 Receipt
对象数组。我希望它被排序为 NSDictionary
,其键将是字母,值将是 Receipt
的数组,其 Retailer
对象的 retailerName
以字母开头,数组是按字母顺序排序。
我有:
[
{
"retailerName": "Adidas",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Book My Show",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Albert-Heijn",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Amazon",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "BlackBerry",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lambhorgini",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lewis Outlet",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Boston Store",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lidl",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
]
我需要的是:
{
"A": [
{
"retailerName": "Adidas",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Albert-Heijn",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Amazon",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
],
"B": [
{
"retailerName": "BlackBerry",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Book My Show",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Boston Store",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
],
"L": [
{
"retailerName": "Lambhorgini",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lewis Outlet",
"totalCost": 392.1,
"purchasedOn": 1461218024549
},
{
"retailerName": "Lidl",
"totalCost": 392.1,
"purchasedOn": 1461218024549
}
]
}
我知道情况有点复杂,但我已尽力解释清楚。如果需要,请寻求进一步的解释。
提前致谢。
Array = [Array
sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2)
{
NSNumber *number1 = [NSNumber
numberWithFloat:[someValue floatValue]];
NSNumber *number2 = [NSNumber
numberWithFloat:[[somevalue floatValue]];
return [number2 compare:number1];
}];
您可以选择字典中的特定键并尝试对其进行排序
我解决了我的问题:
这是我所做的:
@implementation NSMutableDictionary (DictionaryForSectionIndex)
+(NSMutableDictionary *)createDictionaryForSectionIndex:(NSArray *)array
{
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (char firstChar = 'a'; firstChar <= 'z'; firstChar++)
{
//NSPredicates are fast
NSString *firstCharacter = [NSString stringWithFormat:@"%c", firstChar];
NSArray *content = [array filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"retailerName beginswith[cd] %@", firstCharacter]];
NSMutableArray *mutableContent = [NSMutableArray arrayWithArray:content];
if ([mutableContent count] > 0)
{
NSString *key = [firstCharacter uppercaseString];
[dict setObject:mutableContent forKey:key];
}
}
return dict;
}
@end