2013-08-26 34 views
3
的一个NSArray

我有以下的NSArray:获取值的列表中的NSDictionary

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] 

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

+1

如果密钥已经是唯一的,那么多个字典有什么意义?一个简单的字典可以保存所有这些信息,你可以用相关的方法检索你的键/值。 – Alladinian

+0

http://stackoverflow.com/questions/10980618/using-nspredicate-to-filter-based-on-multiple-keys-not-values-for-key –

+0

有趣的问题,但强制性的反问题是:什么有你试过了吗?告诉我们你到目前为止所做的工作以及为什么它没有按计划进行。 – Monolo

回答

7

如果没有一些代码来显示你要如何去了解这一点,很难确定到底你是什么之后,并没有在这个问题有点混乱。

首先,谓词就是这样 - 一个可以被证明是真或假的陈述。因此,谓词被用在逻辑表达式中,包括隐式地用于数据库查询中的谓词 - 例如核心数据。

那就是不是你想要什么,如果我正确地读你的问题。你想要的是降低数据模型的复杂性,消除过程中的一些过多的(希望的)信息。一种字典阵列的扁平化。

不够公平。

我还可以看到谓词混淆是如何产生的 - 它们通常是使用键值编码构造的。众所周知,KVC是一种非常强大的技术,可以完成您以后的工作。它只是与逻辑语句无关。

已经证明了这一点,通过KVC,您可以做到自己想做的事,并尽可能少做文章。它是这样的:

NSArray *values = [myArray valueForKeyPath: @"@[email protected]"]; 

NSArray *keys = [myArray valueForKeyPath: @"@[email protected]"]; 

简要说明可能是为了:

,我们希望是

  1. 所有值(或键)各词典的结果,获得一个数组的值(或键)数组
  2. 然后我们想要将这些数组变成单个数组。

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

@unionOfArrays运算符使从后面的表达式获得的数组成为一个整数,即将其平滑到您想要的数组中。

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

+0

非常感谢您对此非常完整的回复!我不是KVC的一员,因为你解释为:“你的代码中只有字符串”,所以调试比较困难。但是目标c中有很多强大的工具使用字符串:( –

+0

我不能告诉你我有多喜欢这个答案!非常感谢!:) –

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]]; 
    } 
} 
+0

这是我的第一个想法,但它是老派的国王,我有办法用'Predicate'做到这一点吗? –

+0

不初始化数组的坏习惯......实际上空值会被打印出来...... –

+0

我试过你的解决方案,它工作得很好。如果我找不到Predicat的解决方案,我会将其作为适当的解决方案 –

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小时

]

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); 
+0

+1。几乎。 :P您使用单个对象创建一个数组,并且该对象是数组。 :)但的确,allValues和allKeys方法似乎是更好的方式。它应该是2个NSArrays在这个代码中没有明确分配,并且赋值应该像arrayOfValues = [dictrionary allValues]; – johnyu