我想将nsarray转换为我正在使用的nsdictionary
- (NSDictionary *) indexKeyedDictionaryFromArray:(NSArray *)array
{
id objectInstance;
NSUInteger indexKey = 0;
NSMutableDictionary *mutableDictionary = [[NSMutableDictionary alloc] init];
for (objectInstance in array)
[mutableDictionary setObject:objectInstance forKey:[NSNumber numberWithUnsignedInt:indexKey++]];
return (NSDictionary *)[mutableDictionary autorelease];
}
输出结果是:
{
0 = {
Event = "";
ID = 1; };
3 = {
Event = "";
ID = 77; };
2 = {
Event = "";
ID = 23; };
1 = {
Event = "";
ID = 45; };
7 = {
Event = "";
ID = 10; };
5 = {
Event = "";
ID = 26; };
6 = {
Event = "";
ID = 27;
};
8 = {
Event = "";
ID = 28;
};
}
转换为nsdictionary后,nsdictionary的顺序不符合原始顺序,我想在nsarray中显示相同的顺序,我不知道怎么做?你能救我吗?
答案 0 :(得分:1)
NSDictionary
没有订单。对密钥进行排序并使用它们来访问条目。
答案 1 :(得分:1)
如果我从评论中对@ACB和@Zaph的回复中理解正确,您需要执行以下操作:
维护一个集合,将整数键映射到按键排序的对象值。
如果我理解正确,数组就不能满足您的需要,因为数组中的整数键不允许“漏洞”。但是,您需要允许漏洞:在您的问题的输出中,缺少4的键值对。因此,字典对您很有吸引力。
不幸的是,正如@Zaph指出的那样,字典不允许你维护对它包含的键值对的排序。但是,您只想在UITableView
中按键排序的字典中显示值。据推测,只要字典的内容在表格视图中以正确的顺序显示,字典序列化到磁盘(使用writeToFile:atomically:
)的顺序并不重要。
字典可用于此目的,如下所示。首先,我们需要一个班级PFXKeyValuePair
;
@interface PFXKeyValuePair : NSObject
@property (nonatomic) id<NSCopying> key;
@property (nonatomic) id value;
+ (PFXKeyValuePair *)pairWithValue:(id)value forKey:(id<NSCopying>)key;
+ (NSArray *)pairsWithValues:(NSArray *)values forKeys:(NSArray *)keys;
@end
@implementation PFXKeyValuePair
+ (PFXKeyValuePair *)pairWithValue:(id)value forKey:(id<NSCopying>)key
{
PFXKeyValuePair *pair = [[PFXKeyValuePair alloc] init];
pair.value = value;
pair.key = key;
return pair;
}
+ (NSArray *)pairsWithValues:(NSArray *)values forKeys:(NSArray *)keys
{
NSAssert(values.count == keys.count, @"The array of values must be the same size as the array of keys.");
NSUInteger count = values.count;
NSMutableArray *mutableRes = [NSMutableArray array];
for (NSUInteger index = 0; index < count; index++) {
PFXKeyValuePair *pair = [PFXKeyValuePair pairWithValue:values[index] forKey:keys[index]];
[mutableRes addObject:pair];
}
return [mutableRes copy];
}
@end
其次,我们需要NSDictionary
上的类别方法:
@interface NSDictionary (PFXAdditions)
- (NSArray *)pfx_keyValuePairsSortedByKeyUsingComparator:(NSComparator)comparator;
@end
@implementation NSDictionary (PFXAdditions)
- (NSArray *)pfx_keyValuePairsSortedByKeyUsingComparator:(NSComparator)comparator
{
NSArray *sortedKeys = [self.allKeys sortedArrayUsingComparator:comparator];
NSArray *sortedValues = [self objectsForKeys:sortedKeys notFoundMarker:[NSNull null]];
return [PFXKeyValuePair pairsWithValues:sortedValues forKeys:sortedKeys];
}
@end
注意:在上文中,PFX
和pfx
是占位符。你应该用适合你项目的前缀替换它们。
我们可以在填充UITableView
时使用此类别方法。假设我们有一个属性
@property (nonatomic) NSDictionary *events;
让我们假设表视图只有一个部分可以显示这些事件。
然后我们可以在–tableView:numberOfRowsInSection:
子类中实现UITableViewController
,如下所示:
– (NSInteger)tableView:(UITableView *)tableView numberOfRowsInSection:(NSInteger)section
{
return self.events.count;
}
在我们–tableView:numberOfRowsInSection:
的实现中,我们可以确定字典中的相应条目,如下所示:
- (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
{
//...
NSArray *pairs = [self.events pfx_keyValuePairsSortedByKeyUsingComparator:^(id obj1, id obj2) {
NSNumber *key1 = (NSNumber *)obj1;
NSNumber *key2 = (NSNumber *)obj2;
return [key1 compare:key2];
}];
NSUInteger index = [indexPath indexAtPosition:1];
PFXKeyValuePair *pair = pairs[index];
/*
At this point, pair.value will be a dictionary as in your output above
holding a value for the key @"Event" and a value for the key @"ID".
*/
//...
}
通过使pairs
成为属性并且仅在必要时计算它(例如,仅在重新加载表的数据之前计算pairs
),可以更快地实现这一点。
注意:使用这种方法,字典仍然不会被序列化到磁盘上(按顺序调用-writeToDisk:atomically:
)“并且您的输出仍然与您的问题中的相同。但是,这并不重要:当在表视图中向用户显示数据时,数据将按照您的希望进行排序。
答案 2 :(得分:0)
这是示例之一,获取emplyee列表NSMutableArray并创建NSMutableDictionary .......
NSMutableArray *emloyees = [[NSMutableArray alloc]initWithObjects:@"saman",@"Ruchira",@"Rukshan",@"ishan",@"Harsha",@"Ghihan",@"Lakmali",@"Dasuni", nil];
NSMutableDictionary *dict = [NSMutableDictionary dictionary];
for (NSString *word in emloyees) {
NSString *firstLetter = [[word substringToIndex:1] uppercaseString];
letterList = [dict objectForKey:firstLetter];
if (!letterList) {
letterList = [NSMutableArray array];
[dict setObject:letterList forKey:firstLetter];
}
[letterList addObject:word];}NSLog(@"dic %@",dict);