繁体   English   中英

NSArray和NSDictionary

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM