[英]NSArray and NSDictionary
我在NSArray中有NSDictionaries,如下所示。
array(dictionary(“ user”:1,“ p1”:1),dictionary(“ user”:2,“ p1”:3),dictionary(“ user”:1,“ p1”:5),dictionary(“用户“:2,” p1“:7))
我想将此数组转换为字典,如下所示。
NSArray *u1 = [NSArray arrayWithObjects:@"1", @"5", nil];
NSArray *u2 = [NSArray arrayWithObjects:@"3", @"7", nil];
keys = [NSArray arrayWithObjects:@"u1", @"u2", nil];
points = [NSDictionary dictionaryWithObjectsAndKeys:u1, @"u1", u2, @"u2", nil];
我怎样才能做到这一点? 我迷路了,你们能帮我吗?
您是否不能遍历原始数组,询问每个字典,键“ user”的对象是否为1,如果是,则将该对象复制到索引为0的新数组中? 或者,如果您的用户编号按计数顺序,甚至索引编号等于该用户编号。 然后重复“ user” = 2,等等。然后创建一个字典,以便每个键/对象对都是由keys数组中的键(keys [i])和新数组中的对象(objects [i])创建的。
你尝试了什么?
这是一些直接输入答案的代码,因此尚未经过测试:
您尚未为原始数组指定名称,因此我们假设它是:
NSArray *originalArray;
我们需要一个可变的字典来存储结果:
NSMutableDictionary *points = [NSMutableDictionary new];
现在我们需要处理原始数组中的每个元素,并且它是一个字典:
for(NSDictionary *item in originalArray)
{
在points
数组中获取与item
匹配的当前条目。 您不会为您的条目提供类型,因此我们将使用id
:
id currentUser = [item objectForKey:@"user"];
NSMutableArray *currentValues = [points objectForKey:currentUser];
如果这是currentUser
的第一次出现,则currentValues
将为nil
,我们需要为p1
值创建一个数组并将其添加到points
:
if (currentValues == nil)
[points addObject:[NSMutableArray arrayWithObject:[item objectForKey:@"p1"]
forKey:currentUser
]
]
否则,我们只需将p1
值添加到数组中:
else
[currentValues setObject:[item objectForKey:@"p1"]];
结束循环并获取密钥:
}
NSArray *keys = [points allKeys];
现在,如果您使用的是Xcode 4.5,则可以对其中一些使用现代语法:
NSMutableDictionary *points = [NSMutableDictionary new];
for(NSDictionary *item in originalArray)
{
id currentUser = item[@"user"];
NSMutableArray *currentValues = points[currentUser];
if (currentValues == nil)
points[currentUser] = [NSMutableArray arrayWithObject:item[@"p1"];
else
[currentValues addObject:item[@"p1"]];
}
NSArray *keys = [points allKeys];
高温超导
您可以这样做(代码未经测试)
NSMutableArray *keys=[NSMutableArray new];
NSMutableArray *u1=[NSMutableArray new];
NSMutableArray *u2=[NSMutableArray new];
NSMutableDictionary *points=[NSMutableDictionary new];
for (id dict in array){
NSString *user=[dict objectForKey:@"user"];
NSString *p1=[dict objectForKey:@"p1"];
[keys addObject:[NSString stringWithFormat:@"%@",user]];
if( [user isEqualToString:@"1"] ){
[u1 addObject:user];
}
else{
[u2 addObject:user];
}
}
points=[NSDictionary dictionaryWithObjectsAndKeys:u1,@"u1",u2, @"u2", nil];
另一个可能的解决方案(适用于任意数量的用户):
NSArray *orig = @[
@{@"user" : @"1", @"p1" : @"1"},
@{@"user" : @"2", @"p1" : @"3"},
@{@"user" : @"1", @"p1" : @"5"},
@{@"user" : @"2", @"p1" : @"7"},
];
// Create set of all users (without duplicates)
NSSet *users = [NSSet setWithArray:[orig valueForKey:@"user"]];
NSMutableDictionary *points = [NSMutableDictionary dictionary];
for (NSString *user in users) {
// newKey = "u" + username, e.g. "u1" or "u2":
NSString *newKey = [@"u" stringByAppendingString:user];
// newValue = array of "p1" values of the current user:
NSPredicate *pred = [NSPredicate predicateWithFormat:@"user == %@", user];
NSArray *newValue = [[orig filteredArrayUsingPredicate:pred] valueForKey:@"p1"];
// Add to dictionary:
[points setObject:newValue forKey:newKey];
}
NSLog(@"%@", points);
输出:
{
u1 = (
1,
5
);
u2 = (
3,
7
);
}
密钥可以通过
NSArray *keys = [points allKeys];
大量的方法。 这是另一个:
NSArray *originalArray = @[
@{@"user":@"u1", @"p1":@"1"},
@{@"user":@"u2", @"p1":@"3"},
@{@"user":@"u1", @"p1":@"5"},
@{@"user":@"u2", @"p1":@"7"}
];
NSLog(@"originalArray = %@", originalArray);
NSMutableDictionary *results = [NSMutableDictionary dictionary];
for (NSDictionary *dictionary in originalArray) {
NSString *user = dictionary[@"user"];
NSString *p1 = dictionary[@"p1"];
if (!results[user])
results[user] = [NSMutableArray array];
[results[user] addObject:p1];
}
NSLog(@"results = %@", results);
这需要:
originalArray = (
{
p1 = 1;
user = u1;
},
{
p1 = 3;
user = u2;
},
{
p1 = 5;
user = u1;
},
{
p1 = 7;
user = u2;
}
)
并给
results = {
u1 = (
1,
5
);
u2 = (
3,
7
);
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.