iOS用数组过滤数组

Posted

技术标签:

【中文标题】iOS用数组过滤数组【英文标题】:iOS filter an array with an array 【发布时间】:2012-12-10 05:19:51 【问题描述】:

我有一个字符串数组,我想将其用作从 plist 创建的另一个字典数组的过滤器。例如,如果我有一个看起来像这样的字典列表:

Key:      Value:
car1      audi
car2      bmw
car3      bmw
car4      audi
car5      jaguar

我的字符串数组是“audi, jaguar”。我将如何对其进行编码,以便我可以创建一个返回“car1、car4、car5”的新数组?希望这是有道理的。或者更好的是,我怎样才能遍历这个字典并根据一个值对其进行过滤,然后创建一个新的字典数组来使用。

代码:

-(void)plotStationAnnotations 

desiredDepartments = [[NSMutableArray alloc] init];

BOOL tvfrSwitchStatus = [[NSUserDefaults standardUserDefaults] boolForKey:@"tvfrSwitchStatus"];
BOOL hfdSwitchStatus =  [[NSUserDefaults standardUserDefaults] boolForKey:@"hfdSwitchStatus"];

if (tvfrSwitchStatus) 
    NSString *tvfr = @"TVF&R";
    [desiredDepartments addObject:tvfr];

if (hfdSwitchStatus) 
    NSString *hfd = @"HFD";
    [desiredDepartments addObject:hfd];


NSLog(@"Array 1 = %@", desiredDepartments);

NSString *path = [[NSBundle mainBundle] pathForResource:@"stationAnnotations" ofType:@"plist"];
NSMutableArray *anns = [[NSMutableArray alloc] initWithContentsOfFile:path];

NSMutableArray *newDictionaryArray = [NSMutableArray array];
for (NSDictionary *dictionary in anns) 
    for (NSString *string in desiredDepartments) 
        if ([dictionary allKeysForObject:string]) 
            [newDictionaryArray addObject:dictionary];
            break;
        
    


NSLog(@"Array = %@", keyMutableArray);

for (int i = 0; i < [keyMutableArray count]; i++) 

    float realLatitude = [[[keyMutableArray objectAtIndex:i] objectForKey:@"latitude"] floatValue];
    float realLongitude = [[[keyMutableArray objectAtIndex:i] objectForKey:@"longitude"] floatValue];

    StationAnnotations *myAnnotation = [[StationAnnotations alloc] init];
    CLLocationCoordinate2D theCoordinate;
    theCoordinate.latitude = realLatitude;
    theCoordinate.longitude = realLongitude;
    myAnnotation.coordinate = theCoordinate;
    myAnnotation.title = [[keyMutableArray objectAtIndex:i] objectForKey:@"station"];
    myAnnotation.subtitle = [[keyMutableArray objectAtIndex:i] objectForKey:@"department"];
    [mapView addAnnotation:myAnnotation];


【问题讨论】:

【参考方案1】:

可能是这样的

NSArray *array1;
if([array1 containsObject : someValue])

可以提供帮助。 someValue 可以是您想要检查它们是否存在于 array1 中的值。

【讨论】:

【参考方案2】:

你可以做这样的事情来按键过滤:

NSArray *keysToLookFor = [NSArray arrayWithObjects:@"car1", @"car4", @"car5", nil];
NSArray *foundObjects = [dictionary objectsForKeys:keysToLookFor notFoundMarker:nil];

或者像这样按值过滤:

NSString *valueToLookFor = @"Audi";
NSArray *keyArray = [dictionary allKeysForObject:valueToLookFor];

// To filter by multiple values
NSArray *valuesToFilterBy = [NSArray arrayWithObjects:@"Bmw", @"Audi", nil];
NSMutableArray *keyMutableArray = [NSMutableArray array];
for (NSString *string in valuesToFilterBy) 
    [keyMutableArray addObjectsFromArray:[dictionary allKeysForObject:string]];

更新了数组中字典的答案:

NSArray *dictionaryArray; // The array of dictionaries that you have
NSMutableArray *newDictionaryArray = [NSMutableArray array];
NSArray *valuesToFilterBy = [NSArray arrayWithObjects:@"Bmw", @"Audi", nil];
for (NSDictionary *dictionary in dictionaryArray) 
    for (NSString *string in valuesToFilterBy) 
        if ([dictionary allKeysForObject:string]) 
            [newDictionaryArray addObject:dictionary];
            break;
        
    

【讨论】:

哪里有“字典”?我有很多字典……那我该怎么做呢? 当你说你有一个字典数组时,我不确定你的意思,你的 plist 应该只是一个字典,其中包含你在上面提供的那个字典中的键和值。您在上面提供的每个值/键是否在单独的字典中?如果是这样,您应该将它们保存在一个字典中,而不是字典数组中。 我有一个包含大约 30 个字典的数组。每个字典都有 4 个元素。 已更新答案以说明数组中的字典,我不确定您是否要保留过滤后的字典数组或过滤后的键数组以用于过滤的指定值,但可以轻松更改代码以保留经过过滤的字典数组。 基本上,在那个 plist 中,有更多具有不同部门值的字典。我有一个字符串数组,例如@“TVF&R,HFD,CFD”,我想从原始字典创建一个新数组,其中的部门等于字符串数组中的一个对象。

以上是关于iOS用数组过滤数组的主要内容,如果未能解决你的问题,请参考以下文章

iOS NSArray数组过滤

用数组过滤猫鼬数组?

如何在 iOS swift 中使用文本字段过滤日期数组?

ios中的过滤器数组检查多个属性

在iOS中的字典中使用字典数组的NSPredicate进行过滤

iOS 简单数组谓词