2015-06-07 49 views
1

我有一个yyyyMMdd格式的日期列表,其格式为long。我已创建字典yyyyMMddyyyyMM(如NSString)。我需要过滤NSDictionary(通过value)并创建一个新的窗体。怎么做?如何按值过滤NSDictionary并从中创建新的NSDictionary?

备注:我想这是重复的,但我无法弄清楚如何做到这一点。

编辑: 我不明白为什么我的问题被标记为复制与解决我的问题是C#的问题吗? 据我所知(我在Objective-C中的知识是有限的),语法是非常不同的。我也不知道目标C中的linqlambdas

+0

如果您已经认为,这是重复的,为什么不首先使用搜索功能? – d4Rk

+0

我已经使用Google和搜索功能@ d4Rk,但我无法理解如何去做。出于这个原因,我粘贴该评论。我已经得到-1。我试着做对了。其他选项是遍历'NSDictionary'并将'value'与过滤器字符串进行比较,但我认为这很不明显。但如果我没有找到其他解决方案,我会这样。 – new2ios

+0

这是怎么回事(我在google上的第一个结果)? http://stackoverflow.com/questions/2131648/filtering-out-values-from-a-c-sharp-generic-dictionary – d4Rk

回答

5

有很多方法可以做到这一点(包括你认为不喜欢的人)。这里有一个:

NSArray* keys = [dict keysOfEntriesPassingTest:^BOOL(id key, id obj, BOOL *stop){ 
    // return YES or NO depending on whether the value (in "obj") passes your test 
}]; 
NSDictionary* newDict = [dict dictionaryWithValuesForKeys:keys]; 

被警告,-dictionaryWithValuesForKeys:,当应用于字典,可以做一些意想不到的开始键“@”。那是因为它的实现是根据-valueForKey:NSDictionary的实现方法专门处理这种密钥。对于你描述的情况应该不重要。

+0

10倍,@ Ken Thomases。我的意思是“不喜欢”,因为我认为除了迭代之外肯定还有其他方法。我并不是说这是不恰当的,但我希望更优雅(以我的观点)解决方案。 – new2ios

+0

如何在不迭代的情况下检查列表上的项目?至少有一个'NSDictionary'的迭代方法。把肯的方法放在一个类别中,你会得到相同的结果。 –

+0

例如,@Amin Negm-Awad,过滤(带谓词)。可能是它在里面迭代,但你不会迭代你自己。这是我的逻辑。我不认为这是正确的。 – new2ios

0

所以我仍然不是100%确定你想要做什么,为什么你想这样做。

但检查了这一点:有

// create a new dict for this example, you can just use ur existing one 
NSDictionary *dict = [[NSDictionary alloc] initWithObjectsAndKeys:@"201506", @"20150601", 
                    @"201505", @"20150501", nil]; 

NSArray *resultArray = [[dict allValues] filteredArrayUsingPredicate:[NSPredicate predicateWithFormat:@"SELF == %@", @"201506"]]; 

// testing the output 
NSLog(@"%@", resultArray); 

你没有在最后一本字典,而是从字典中的过滤值的数组。也许你必须根据需要调整谓词并将resultArray的东西放回到字典中,但我不知道你的结果应该如何。

0
//old dictionary stores @{date: string} ,where data = NSDate; string = NSString from NSDate 
NSMutableArray * storedValues = [[oldDictionary allValues]mutableCopy]; 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF > %@",[NSDate date]]; 
NSArray *sortedArray = [storedValues filteredArrayUsingPredicate:predicate]; 


    NSMutableDictionary *newDictionary = [NSMutableDictionary dictionary]; 
    for(NSDate *date in sortedArray) { 
     NSArray *keys = [oldDictionary allKeysForObject:date]; 
     NSString *key = keys.firstObject; 
    [newDictionary setObject:date forKey:key]; 
}