我们在开发中经常使用的Predicate谓词,主要是正则表达式的使用,今天给大家简单的讲讲怎样去使用谓词。

因为内容比较简单,所以直接上代码展示:

NSMutableArray *people_arr = [NSMutableArray new];
    NSMutableArray *filter_arr = [NSMutableArray new];
    for (int i = 0; i < 10; i++) {
        People *people = [People new];
        people.name = @[@"jack",@"jester",@"jester",@"joce",@"joke",@"java",@"amy",@"jason",@"mike",@"jwt"][i];
        people.age = 15+i;
        people.gender = i%2? @"男":@"女";
        people.address = @[@"郑州",@"上海",@"济南",@"北京",@"杭州"][arc4random()%5];
        for (int j = 0; j < 3; j ++) {
            Employee *employee = [Employee new];
            employee.employeeId = i+arc4random()%3;
            employee.department = @[@"研发部",@"人事部",@"财务部",@"运营部"][arc4random()%4];
            [people.employees addObject:employee];
        }
        [people_arr addObject:people];
        arc4random()%3 == 0 ? [filter_arr addObject:people] : NULL;
    }
    /*
    // 利用 NSSortDescriptor 对对象数组,按照某一属性或某些属性的升序降序排列
    NSSortDescriptor *des1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSSortDescriptor *des2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
    [people_arr sortUsingDescriptors:@[des1, des2]];

    // 利用 block回调 对对象数组,按照某一属性或某些属性的升序降序排列
    [people_arr sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        People *p1 = (People *)obj1;
        People *p2 = (People *)obj2;
        return [p1.name compare:p2.name];
    }];

    // 利用 自定义比较方法 对对象数组,按照某一属性或某些属性的升序降序排列
    [people_arr sortUsingSelector:@selector(comparePeople:)];
    NSLog(@"sorted:%@", people_arr);
    */

    //------------------------ Predicate谓词的简单使用
    // self 表示数组元素/字符串本身
    // 比较运算符 =/==(等于)、>=/=>(大于等于)、<=/=<(小于等于)、>(大于)、<(小于)、!=/<>(不等于)
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"self = %@",[people_arr lastObject]];//比较数组元素相等
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"address = %@",[(People *)[people_arr lastObject] address]];//比较数组元素中某属性相等
    ////NSPredicate *pre = [NSPredicate predicateWithFormat:@"age in {18,21}"];//比较数组元素中某属性值在这些值中
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"age between {18,21}"];//比较数组元素中某属性值大于等于左边的值,小于等于右边的值

    // 逻辑运算符 and/&&(与)、or/||(或)、not/!(非)
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"address = %@ && age between {19,22}",[(People *)[people_arr lastObject] address]];

    // 字符串比较运算符 beginswith(以*开头)、endswith(以*结尾)、contains(包含)、like(匹配)、matches(正则)
    // [c]不区分大小写 [d]不区分发音符号即没有重音符号 [cd]既 又
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name beginswith[cd] 'ja'"];
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"name matches '^[a-zA-Z]{4}$'"];

    //集合运算符 some/any:集合中任意一个元素满足条件、all:集合中所有元素都满足条件、none:集合中没有元素满足条件、in:集合中元素在另一个集合中
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"all employees.employeeId in {7,8,9}"];
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"self in %@",filter_arr];
    // $K:用于动态传入属性名、%@:用于动态设置属性值(字符串、数字、日期对象)、$(value):可以动态改变
    //NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K > $age",@"age"];
    //pre = [pre predicateWithSubstitutionVariables:@{@"age":@21}];
    // NSCompoundPredicate 相当于多个NSPredicate的组合
    //NSCompoundPredicate *compPre = [NSCompoundPredicate andPredicateWithSubpredicates:@[[NSPredicate predicateWithFormat:@"age > 19"],[NSPredicate predicateWithFormat:@"age < 21"]]];
    // 暂时没找到用法
    //NSComparisonPredicate *compPre = [NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"name"] rightExpression:[NSExpression expressionForVariable:@"ja"] modifier:NSAnyPredicateModifier type:NSBeginsWithPredicateOperatorType options:NSNormalizedPredicateOption];
    //[people_arr filterUsingPredicate:compPre];
    NSPredicate *pre = [NSPredicate predicateWithBlock:^BOOL(id evaluatedObject, NSDictionary *bindings) {
        return [evaluatedObject age] > 21;
    }];

    // NSPredicate 不影响原数组,返回数组即为过滤结果
    //NSArray *temp_arr = [people_arr filteredArrayUsingPredicate:pre];
    //NSLog(@"%@", temp_arr);
    // NSPredicate 原数组数据即为过滤结果
    [people_arr filterUsingPredicate:pre];

    NSLog(@"%@", people_arr);

上面涉及到的谓词的简单使用,下面顺便讲三个对象数组排序的方法:

第一种方式: 利用 NSSortDescriptor 对对象数组,按照某一属性或某些属性的升序降序排列
    NSSortDescriptor *des1 = [NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
    NSSortDescriptor *des2 = [NSSortDescriptor sortDescriptorWithKey:@"age" ascending:NO];
    [people_arr sortUsingDescriptors:@[des1, des2]];

这种方式,利用多个NSSortDescriptor对象的组合使用,进行排序,而且组合顺序不同,得到的结果应该也会有所差别。这里没有进行测试,想探索的可以自己去试一试

第二种方式:利用 block回调 对对象数组,按照某一属性或某些属性的升序降序排列
    [people_arr sortUsingComparator:^NSComparisonResult(id  _Nonnull obj1, id  _Nonnull obj2) {
        People *p1 = (People *)obj1;
        People *p2 = (People *)obj2;
        return [p1.name compare:p2.name];
    }];

第三种方式:利用自定义比较方法 对对象数组,按照某一属性或某些属性的升序降序排列
 [people_arr sortUsingSelector:@selector(comparePeople:)];

源码下载:https://github.com/hbblzjy/iOCNSPredicateDemo

iOS开发之谓词Predicate和对象数组的排序的更多相关文章

  1. PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($this, "cmp")))

    PHP 根据对象属性进行对象数组的排序(usort($your_data, "cmp");)(inside the class: usort($your_data, array($ ...

  2. 对象数组自定义排序--System.Collections.ArrayList.Sort()

    使用System.Collections.ArrayList.Sort()对象数组自定义排序 其核心为比较器的实现,比较器为一个类,继承了IComparer接口并实现int IComparer.Com ...

  3. 利用Comparable接口实现对对象数组的排序

    Arrays 类中的sort方法承诺可以对对象数组进行排序,但是需要对象所属的类实现Comparable接口 任何实现Comparable接口的对象都需要实现该方法 并且在Java SE 5.0之前该 ...

  4. C#基础:通过委托给任何对象数组进行排序

    在日常编写程序的时候,我们需要对一些对象进行排序,比如对int数组进行排序,自定义类数组进行排序,首先我们先讨论对数组进行排序,我们应该对冒泡排序比较熟悉,下面是数组用冒泡排序的方法 for (int ...

  5. iOS开发系列--Objective-C之类和对象

    概述 前面已经简单介绍过ObjC的基础知识,让大家对ObjC有个大致的印象,今天将重点解释ObjC面向对象的特性.ObjC相对于C语言多了面向对象特性,但是ObjC又没有其他面向对象语言那么多语法特性 ...

  6. ios开发 oc 的类方法与对象方法

    --------开始前先申明一下:小编为了让大家看出效果,在编码中命名方式会又些不规范. 首先我们先来了解一下什么是类方法与对象方法. 对象方法: 对象是由“-”开头.比如:-(void)Runner ...

  7. IOS开发学习笔记010-面向对象的三大特性

    面向对象的三大特性 1.封装 2.继承 3.多态 一.封装 将类内部的属性保护起来,在外部不能直接访问,那么如果需要访问怎么办呢? OC提供了set方法来对成员变量进行访问 set方法 1.作用:提供 ...

  8. js通用对象数组冒牌排序

    数组对象通用 function sort(data, sortFiled, orderby) { var result = data, temp; for (var i = 0; i < res ...

  9. iOS开发系列文章(持续更新……)

    iOS开发系列的文章,内容循序渐进,包含C语言.ObjC.iOS开发以及日后要写的游戏开发和Swift编程几部分内容.文章会持续更新,希望大家多多关注,如果文章对你有帮助请点赞支持,多谢! 为了方便大 ...

随机推荐

  1. Android 6.0 Kotlin 蓝牙BLE扫描

    package com.arci.myapplication import android.os.Bundleimport android.support.design.widget.Snackbar ...

  2. Ajax传地址URL编码格式

    当我们用Ajax传递路径的时候,有可能会出错,尤其是路径中有汉字的时候,传递的路径与接收的路径不同.解决方法:在传递路径的时候对路径编码,接收的时候解码存入数据库. 如: <!DOCTYPE h ...

  3. PAT 天梯赛 L1-044. 稳赢 【循环】

    题目链接 https://www.patest.cn/contests/gplt/L1-044 题意 根据对方给出剪刀石头步 给出对应的胜利出招,每K次 要有一个平局 思路 用一个循环,然后每K次 判 ...

  4. 自定义mousewheel事件,实现图片放大缩小功能实现

    本文是承接 上一篇的<自定义鼠标滚动事件>  的基础上实现的,建议大家先看一下上一篇的mousewheel的实现,再浏览下文: 上篇中我们介绍到: $element.mousewheel( ...

  5. hadoop21---使用代理修改List,代理流程

    package cn.itcast_05_proxy; import java.lang.reflect.InvocationHandler; import java.lang.reflect.Met ...

  6. MMU解读

    转:https://blog.csdn.net/yueqian_scut/article/details/24816757 mmu页表也是放在内存中,mmu里有一个寄存器存放页表首地址,从而找到页表( ...

  7. AMBA总线基础知识简介

    AMBA:Advanced Microcontroller Bus Architecture,是ARMA公司的片内互联总线协议. 1995 - AMBA1.0 APB外设总线及ASB系统总线发布. 1 ...

  8. GRE/GMAT/LSAT长难句300例精讲精练-思维导图

    <GRE/GMAT/LSAT长难句300例精讲精练>是GRE超人气名师陈琦老师团队的又一本新作,也是“再要你命3000”的新成员,从之前的词汇.短语.练习,提升到长难句层面,相信学完本书后 ...

  9. python标准库学习-ftplib

    源码: """An FTP client class and some helper functions. Based on RFC 959: File Transfer ...

  10. [TJOI2010]打扫房间

    题目描述 学校新建了一批宿舍,值日生小A要把所有的空房间都打扫一遍.这些宿舍的布局很奇怪,整个建筑物里所有的房间组成一个N * M的矩阵,每个房间的东南西北四面墙上都有一个门通向隔壁房间.另外有些房间 ...