【问题标题】:Comparing two arrays with NSPredicate用 NSPredicate 比较两个数组
【发布时间】:2013-04-03 10:55:04
【问题描述】:

我有两个数组,一个代表全尺寸图像列表,另一个代表图像的缩略图。有一种方法可以使用 NSPredicate 来检查全尺寸图像是否有缩略图?

拇指称为 img{number}_thumb.jpg,全尺寸图像称为 img{number}.jpg。

【问题讨论】:

  • 使用数组和字符串对你有用吗?
  • 我该怎么做?这就是问题

标签: ios image cocoa nspredicate


【解决方案1】:

使用数组、字符串和循环

NSArray *thumbs=@[@"img1_thumb.jpg",@"img2_thumb.jpg",@"img3_thumb.jpg",@"img4_thumb.jpg",@"img5_thumb.jpg",];
NSArray *images=@[@"img1",@"img2",@"img3",@"img41",@"img5"];

BOOL isSame=YES;
for (NSString *name in images) {
    if (![thumbs containsObject:[NSString stringWithFormat:@"%@_thumb.jpg",name]]) {
        isSame=NO;
        NSLog(@"%@ doesn't has thumb image",name);
        break; //if first not found is not good enough remove this break
    }
}
NSLog(@"%@",isSame?@"All thumb has image":@"All thumb does not have image");

使用 NSPredicate:

for (NSString *image in images) {
    NSPredicate *predicate=[NSPredicate predicateWithFormat:@"SELF like [c]%@",[NSString stringWithFormat:@"%@_thumb.jpg",image]];
    NSArray *filtered=[thumbs filteredArrayUsingPredicate:predicate];
    if (filtered.count==0) {
        NSLog(@"%@ not found",image);
    }
}

【讨论】:

  • 我更喜欢不使用循环,但我认为这是唯一的方法。谢谢你:)
  • 我想您可以使用enumerateObjectsUsingBlock: 同时检查数组以进一步加快速度?
【解决方案2】:

你可以使用indexesOfObjectsPassingTest:

NSArray *imageThumbs=   [NSArray arrayWithObjects:@"img1_thumb.jpg",@"img2_thumb.jpg",@"img3_thumb.jpg",@"img4_thumb.jpg",nil];
    NSArray *images=[NSArray arrayWithObjects: @"img1",@"img2",@"img3",@"img4",@"img5",nil];
    for(NSString *image in images)
    {
        if ([imageThumbs HasPrefix:image]) {
            NSLog(@"has thumbnail %@",image);
        }
    }  

@interface NSArray (fileterArrayUsingBlocks)
-(BOOL)HasPrefix : (NSString *)path;
@end
@implementation NSArray (fileterArrayUsingBlocks)

-(BOOL)HasPrefix : (NSString *)path
{
    NSIndexSet  *lIndexSet = [self indexesOfObjectsPassingTest:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj hasPrefix:path]) {
            *stop = YES;  
            return YES;
        } else
            return NO;
    }];
    if (![lIndexSet count])
        return NO;
    return YES;
}

@end

【讨论】:

    【解决方案3】:

    如果可以安排两个数组的值相同(即img1.jpg和img1_thumb.jpg都用“1”表示,但在不同的数组中),那么没有缩略图的图像集是:

    [[NSMutableSet setWithArray:images] minusSet:[NSSet setWithArray:thumbnails]]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-24
      • 2018-12-28
      • 1970-01-01
      • 1970-01-01
      • 2010-12-11
      相关资源
      最近更新 更多