4

我有以下 NSArray :

NSArray myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];

我想要我的字典的价值列表:

@[@"5 min",@"15 min",@"30 min",@"1 hour"]

以及我的字典键列表:

@[@300, @900, @1800, @3600]

最好的方法是什么?我在考虑谓词,但我不知道如何使用它?

4

4 回答 4

9

如果没有一些代码来显示你想要如何去做,就很难确定你到底在追求什么,而且这个问题有点混乱。

首先,谓词就是这样——一个可以被证明为真或假的陈述。谓词因此被用在逻辑表达式中,包括那些在数据库查询中隐式使用的——比如 Core Data。

如果我正确阅读了您的问题,那不是您想要的。您想要的是降低数据模型的复杂性,在此过程中删除一些多余的(希望是)信息。字典数组的一种扁平化。

很公平。

我还可以看到与谓词的混淆是如何产生的——它们通常是使用键值编码构造的。众所周知,KVC 是一种非常强大的技术,可以实现您所追求的目标。它只是与逻辑语句没有太大关系。

清除这些后,使用 KVC,您可以做任何您想做的事,并且无需大惊小怪。它是这样的:

NSArray *values = [myArray valueForKeyPath: @"@unionOfArrays.@allValues"];

NSArray *keys   = [myArray valueForKeyPath: @"@unionOfArrays.@allKeys"];

一个简短的解释可能是为了:

我们想要的结果是

  1. 每个字典的所有值(或键),获取值(或键)数组的数组
  2. 然后我们想将这些数组扁平化为一个数组。

要使用 KVC 从字典中获取所有值(或键),特殊键分别是@allValues@allKeys

@unionOfArrays运算符将从其后的表达式中获得的数组合并,即将其展平为您想要的数组。

您为这种编码简单性付出的代价是您必须将 KVC 密钥路径与集合运算符一起使用,它们只是代码中的字符串。因此,您会失去编译器对语法的任何帮助,并且它不会检查您输入的键是否存在于对象中。同样,例如,如果您输入错误或使用错误的运算符,调试器和错误消息也无济于事。

于 2013-08-26T12:25:34.507 回答
1

您可以使用字典属性 allValues 来获取字典的所有值。

在您的情况下尝试此代码

NSArray *myArray = @[@{@300:@"5 min"},
                     @{@900:@"15 min"},
                     @{@1800:@"30 min"},
                     @{@3600:@"1 hour"}];
NSMutableArray *arr = [NSMutableArray array];
for (NSDictionary *dict in myArray) {
    [arr addObject:[[dict allValues] objectAtIndex:0]];
}
NSLog(@"%@",arr);

注意:确保每个字典中只有一个值。它会回来

[

5分钟,

15分钟,

30分钟,

1小时

]

于 2013-08-26T11:37:57.957 回答
1

@johnyu 的答案在技术上是正确的,但我认为没有任何理由包含辅助循环,尤其是在数据结构保持不变的情况下。

NSArray *myArray = @[@{@300:@"5 min"},
                     @{@900:@"15 min"},
                     @{@1800:@"30 min"},
                     @{@3600:@"1 hour"}];

NSMutableArray *arrayOfValues = [NSMutableArray new];
NSMutableArray *arrayOfKeys = [NSMutableArray new];

for (NSDictionary *dictionary in myArray) {
    [arrayOfValues addObject:dictionary.allValues[0]];
    [arrayOfKeys addObject:dictionary.allKeys[0]];
}

NSLog(@"%@",arrayOfKeys);
NSLog(@"%@",arrayOfValues);
于 2013-08-26T12:24:32.313 回答
0

尝试这个:

NSArray *myArray = @[@{@300:@"5 min"},
                    @{@900:@"15 min"},
                    @{@1800:@"30 min"},
                    @{@3600:@"1 hour"}];
NSMutableArray *keyArray = [[NSMutableArray alloc] init];
NSMutableArray *valueArray = [[NSMutableArray alloc] init];
for (NSDictionary *dictionary in myArray) {
    for (NSString *key in dictionary) {
        [keyArray addObject:key];
        [valueArray addObject:[dictionary objectForKey:key]];
    }
}
于 2013-08-26T11:12:56.293 回答