ios数组过滤
① ios开发中NSArray怎么用NSPredicate来过滤数组内容
//找出一个数组
NSFileManager *fileManager = [NSFileManager defaultManager];
NSString *defaultPath = [[NSBundle mainBundle] resourcePath];
NSError *error;
NSArray *directoryContents = [fileManager contentsOfDirectoryAtPath:defaultPath error:&error]
//匹配字符串,反回结果, SELF==表示数组中每一个元素
NSString *match = @"imagexyz-999.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF == %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//近似匹配字符串,类似SQL中的语法
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//不区分大小写匹配
NSString *match = @"imagexyz*.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF like[cd] %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
//正则匹配
NSString *match = @"imagexyz-//d{3}//.png";
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF matches %@", match];
NSArray *results = [directoryContents filteredArrayUsingPredicate:predicate];
② ios search controller搜索数组里数组怎么办
NSPredicate是什么NSPredicate:谓词
字面翻译是这个意思,但是我觉得谓词这个词太难以理解了
NSPredicate的具体用途应该还是过滤,类似于过滤条件之类的,相当于一个主语的谓语,所以说会是谓词这个名字。(我是这么理解的)
NSPredicate的创建
我们看到创建谓词使用类方法predicateWithFormat: (NSString*) format,format 里的东西真的
和SQL 的where 条件差不多。
另外,参数format 与NSLog 的格式化模版差不多,如果1 和
188.0 是传递过来的参数,你可以写成如下的形式:
@"pid>%d and height<%f",1,188.0
1.比较运算符 > 、< 、== 、 >= 、<= 、 !=
例:@"number >= 99"
2.逻辑运算符:AND、OR、NOT 这几个运算符计算并、或、非的结果。
3.范围运算符:IN 、BETWEEN
例:@"number BETWEEN {1,5}"
@"address IN {'shanghai','nanjing'}"
4.字符串本身:SELF
例:@"SELF == 'APPLE'"
5.字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
例: @"name CONTAIN[cd] 'ang'" //包含某个字符串
@"name BEGINSWITH[c] 'sh'" //以某个字符串开头
@"name ENDSWITH[d] 'ang'" //以某个字符串结束
注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。
6.通配符:LIKE
例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
@"name LIKE[cd] '???er*'"
7.正则表达式:MATCHES
例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
NSPredicate我暂时都是用于过滤的,否则我们过滤就需要自己写判断 写循环,去判断输出了。
接下来就上代码和例子吧。
建立一个实体类 Dog
@property ( , nonatomic) NSString* name;@property (assign , nonatomic) int age ;
这样我们就有一个类了
我们创建 5只Dog的实体
Dog * dog2=[Dog news];dog2.name=@"这是第二只Dog";dog2.age=@"22";
Dog * dog3=[Dog news];dog3.name=@"这是第三只Dog";dog3.age=@"33";
Dog * dog4=[Dog news];dog4.name=@"这是第四只Dog";dog4.age=@"44";
Dog * dog5=[Dog news];dog5.name=@"这是第五只Dog";dog5.age=@"55";
不要吐槽我的Dogs的年龄 → 。→
然后我们需要一个Array把他们都装进去
酱紫所有的Dog都装到一个数组里了
使用NSPredicate的筛选
- 没有使用NSPredicate的筛选应该大家都会写,循环+判断。。。
- 使用NSPredicate的筛选
NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name=='这是第一只Dog' AND age ==11"];
for(Dog * d in dogArr)
{
if([predicate evaluateWithObject:d])
{
NSLog(d.name);
}
}
以上的代码打印出来的结果就是 这是第一只Dog
NSPredicate筛选一个对象逻辑还是很清晰的,不过这里比较麻烦的就是 还有一个循环,这里我们会发现数组提供了一个方法可以更方便的检索数组对象直接筛选出一个符合谓词的新数组。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"age >11"];NSMutableArray *arrayPre=[dogArr filteredArrayUsingPredicate: pre];
arrayPre里面的对象就会是 除了dog1之外的所有的dog。(至于为什么看我的条件...)
看到这里发现NSPredicate 可以用于自定义的实体的检索、筛选,那如果用于 NSString,NSInteger,bool呢?那我们再看一段代码吧NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];
上面这段代码是匹配字符串的时候 NSPredicate 需要如何声明
使用NSPredicate在两个数组之间进行差异筛选NSArray* array = @[@"aa",@"bb"];NSArray* array2 = @[@"aa",@"bb",@"cc",@"dd"];
NSPredicate* thePredicate = [NSPredicate predicateWithFormat:@"NOT(SELF in %@)",array];
NSArray* arr3 = [array2 filteredArrayUsingPredicate:thePredicate];
NSLog(@"%@",arr3);
上面的代码输出结果 arr3={@"cc" ,@"dd"}
这样大家就很容易理解了
SELF在前面有介绍过 可以往回翻阅一下
NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Apple"]){
printf("YES ");
}else{
printf("NO ");
}关于NSPredicate的其他说明和注意事项,以及技巧
- 动态属性名
假如你的代码如下
NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"];显然代码没有任何问题,但是这个不是最好的写法我建议如下写法:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"name1", @"NAME",nil];
NSPredicate *pre=[preTemplate : dic];
这样看上去可能会让代码逻辑更清晰。
当过滤条件字段都是动态的时候
NSString *key = @"name";NSString *value = @"name1";
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];
然后当你执行到第三行的时候代码就会报错!
逻辑上没错误啊!!!为什么会出错呢?
NSPredicate要自动添加引号,所以最后得到的格式应该是@"'name' = 'name1'"。明显不对。要做的就是:
③ ios 判断数组里面是否有某个元素
package com.by.boss.utils;
import java.util.Arrays;
import java.util.List;
/**
* 工具类:实现一些数组的常用方法
* @author 高伟
* @date Aug 15, 2011 6:01:42 PM
* @description:
*/
public class ArrayUtils {
/**
* 获取指定元素item在指定数组array中的下标
* getItemIndexOfArray
* @param array
* @param item
* @return
* 高伟
* Aug 15, 2011 6:02:26 PM
*/
public static int getItemIndexOfArray(Object[] array , Object item) {
List<Object> list = Arrays.asList(array);
return list.indexOf(item);
}
/*
* main method
*/
public static void main(String[] args) {
String[] array = new String[]{"AAA","BBB","CCC"};
String item1 = "DDD";
System.out.println(ArrayUtils.getItemIndexOfArray(array, item1));
String item2 = "BBB";
System.out.println(ArrayUtils.getItemIndexOfArray(array, item2));
/**
* 输出结果:
* -1
* 1
*/
}
}
④ 如何去除IOS数组中重复的数据
第五十回诸葛亮智算华容关云长义释曹操第五十一回曹仁大战东吴兵孔明一气周公瑾
⑤ ios 数组中取其中的一个匹配的值怎么效率高
>>> mapper{1: ['a', 'b', 'c'], 2: ['d'], 3: ['e'], 4: ['f', 'g'], 5: ['h'], 6: ['i'], 7: ['a', 'g']}>>> def itertransfer(mapper): for k, values in mapper.items(): for v in values: yield (k, v) >>> for k, v in itertr
⑥ ios中怎样把数组从内存中删除
[array removeAllObject] 删除所有
[array removeObjectAtIndex:index]按下标删除元素
[array removeObject:<(id)> inRange:<(NSRange)>]按范围删除
⑦ 数组的情况,设置的过滤方法怎么支持多维数组过滤
这个比较容来易。首先源你数组的大小你自己知道,就假设容量A、B为100吧;其次你需要一个指向A的指针;再次假设你需要过滤A中50个元素,你得知道从什么位置开始过滤吧;的判断过滤的位置加上过滤的数量超过总量没有吧。指针不断++;复制值到B中,知道遇到过滤的开始的位置。指针继续++,将要过滤的数量的值一一跳过,不复制进入B.
⑧ Javascript如何过滤数组
你这个数据格式就有问题吧。。
应该是这样的:
var arr = {
"list":
[{name:"tony","age":22},
{name:"JOE","age":22},
{name:"jod","age":23},
{name:"Kim","age":24}]
};
过滤:专
var array = new Array();
for(var i = 0; i < arr.list.length; i++){
if (arr.list[i].age == 22 ) array.push(arr.list[i]);
}
输出:属
var str="";
for (var j = 0; j < array.length; j++){
str += "name:" + array[j].name + " age:"+array[j].age+"\n";
}
alert(str);
⑨ ios 判断数组中是否有相同的数据
package com.by.boss.utils;
import java.util.Arrays;
import java.util.List;
/**
* 工具类:实现一些数组的常用方法
* @author 高伟
* @date Aug 15, 2011 6:01:42 PM
* @description:
*/
public class ArrayUtils {
/**
* 获取指定元素item在指定数组array中的下标
* getItemIndexOfArray
* @param array
* @param item
* @return
* 高伟
* Aug 15, 2011 6:02:26 PM
*/
public static int getItemIndexOfArray(Object[] array , Object item) {
List<Object> list = Arrays.asList(array);
return list.indexOf(item);
}
/*
* main method
*/
public static void main(String[] args) {
String[] array = new String[]{"AAA","BBB","CCC"};
String item1 = "DDD";
System.out.println(ArrayUtils.getItemIndexOfArray(array, item1));
String item2 = "BBB";
System.out.println(ArrayUtils.getItemIndexOfArray(array, item2));
/**
* 输出结果:
* -1
* 1
*/
}
}
分享
⑩ iOS去除数组中重复元素的几种方法
import java.util.*;
class BaiDu
{
public static void main(String[] args)
{
TreeSet<String> tr = new TreeSet<String>();
String[] s ={"11","22","22","33","33","33"};
System.out.print("====处理前=======");
for(int i=0;i<s.length;i++){
System.out.print(s[i]+" ");
tr.add(s[i]);
}
String[] s2= new String[tr.size()];
System.out.println("=====处理后======");
for(int i=0;i<s2.length;i++){
s2[i]=tr.pollFirst();//从TreeSet中取出元素重新赋给数组
System.out.print(s2[i]+" ");
}
}
}