分享

[iOS]查找数组NSArray中是否包含指定的元素

 wintelsui 2018-06-05

一 问题描述

查找数组中是否包含指定

二 问题解决

方法一

    NSArray  *array =@[@"abc123", @"cde234" , @"fgh456", @"ijk567", @"KLm567", @"MnO890", @"opq012", @"Rst123"];
    //匹配字符串,反回结果, SELF==表示数组中每一个元素
    NSString *match1 = @"MnO890";
    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF == %@", match1];
    NSArray *results1 = [array filteredArrayUsingPredicate:predicate1];
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

方法二

[array enumerateObjectsWithOptions:NSEnumerationReverse usingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if ([obj isEqualToString:@"opq012"]) {
            NSLog(@"%@-索引%d",obj, (int)idx);
        }
    }];  
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

三 拓展延伸

如何使用谓词NSPredicate实现快速寻找。

先看下定义

NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...];  
  • 1

说明:
Format:有如下几种规则


(1)比较运算符>,<,==,>=,<=,!=
可用于数值及字符串
例:@"number > 100"

(2)范围运算符:IN、BETWEEN
例:@"number BETWEEN {1,5}"
   @"address IN {'shanghai','beijing'}"

(3)字符串本身:SELF 
例:@“SELF == ‘APPLE’"

(4)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例:@"name CONTAIN[cd] 'ang'"    //包含某个字符串
   @"name BEGINSWITH[c] 'sh'"   //以某个字符串开头
   @"name ENDSWITH[d] 'ang'"    //以某个字符串结束
注:[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。

(5)通配符:LIKE
例:@"name LIKE[cd] '*er*'"    //*代表通配符,Like也接受[cd].
   @"name LIKE[cd] '???er*'"

(6)正则表达式:MATCHES
例:NSString *regex = @"^A.+e$";   //以A开头,e结尾
   @"name MATCHES %@",regex"
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26

具体使用方法如下

1.NSString对象

    NSArray  *array =@[@"abc123", @"cde234" , @"fgh456", @"ijk567", @"KLm567", @"MnO890", @"opq012", @"Rst123"];
    //匹配字符串,反回结果, SELF==表示数组中每一个元素
    NSString *match1 = @"MnO890";
    NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"SELF == %@", match1];
    NSArray *results1 = [array filteredArrayUsingPredicate:predicate1];

    //近似匹配字符串,类似SQL中的语法
    NSString *match2 = @"fgh45";
    NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"SELF contains %@", match2];
    NSArray *results2 = [array filteredArrayUsingPredicate:predicate2];
    //不区分大小写匹配
    NSString *match3 = @"klm567";
    NSPredicate *predicate3 = [NSPredicate predicateWithFormat:@"SELF like[cd] %@", match3];
    NSArray *results3 = [array filteredArrayUsingPredicate:predicate3];
    //正则匹配
    NSString *match4 = @"[a-zA-Z0-9]{6}";
    NSPredicate *predicate4 = [NSPredicate predicateWithFormat:@"SELF matches %@", match4];
    NSArray *results4 = [array filteredArrayUsingPredicate:predicate4];

    NSLog(@"%@\n%@\n%@\n%@\n",results1,results2,results3,results4);
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21

输出结果

(
    MnO890
)
(
    fgh456
)
(
    KLm567
)
(
    abc123,
    cde234,
    fgh456,
    ijk567,
    KLm567,
    MnO890,
    opq012,
    Rst123
)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19

2.含有属性的对象

@interface Person: NSObject 
{
    NSString *_name;
    NSString *_telephone;
    NSInteger _id;
}

@property (nonatomic, copy) NSString *name;
@property (nonatomic, copy) NSString *telephone;
@property (nonatomic, assign) NSInteger id;

@end
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12

1).等于查询

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == %@", "张三"]; 
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
  • 1
  • 2
  • 3

2).模糊查询

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name CONTAINS %@", @"A"]; //predicate只能是对象
NSArray *filteredArray = [array filteredArrayUsingPredicate:predicate];
  • 1
  • 2
  • 3

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多