【OC加强】枚举介绍、数组的排序、对象的排序、如何利用block排序以及一些数据类型知识

(1)枚举的定义和元素调用

#import <Foundation/Foundation.h>

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        NSArray *[email protected][@"one",@"two",@"three"];
        //把数组变成枚举
        NSEnumerator *enum1=[arr1 objectEnumerator];
        NSString *value1;
        //nextObject如果存在下一个就会返回该值,如果没有则返回nil
        while (value1=[enum1 nextObject]) {
            NSLog(@"%@",value1);
        }
    }
    return 0;
}

(2)数组的排序,sortedArrayUsing...

        NSArray *[email protected][@"one",@"two",@"three"];
        //因为这个数组是不可变数组,所以不恩能够对齐进行任何修改,排序当然也不行,以下方法会返回一个新的值
        [arr1 sortedArrayUsingSelector:@selector(compare:)];
        //我们可以用新返回的值完全覆盖之前的值,这样就相当于得到新的数组
        arr1=[arr1 sortedArrayUsingSelector:@selector(compare:)];
        NSLog(@"%@",arr1);

(3)给自定义的对象排序——其实是对对象的某个成员变量进行排序

自定义初始化方法的时候注意两点:检查super init以及return self。

-(id)initWithName:(int)age addname:(NSString *)name{
    if (self=[super init]) {
        _age=age;
        _name=name;
    }
    return self;
}
//重写对象的输出函数,即直接把对象变量自己输出时,本来是一个地址,现在可以重写这个函数
-(NSString *)description{
    return [NSString stringWithFormat:@"age:%d name:%@",_age,_name];
}
#import <Foundation/Foundation.h>
#import "Person.h"

int main(int argc, const char * argv[]) {

    @autoreleasepool {
        Person *p1=[[Person alloc]initWithAge:18 addname:@"wang"];
        Person *p2=[[Person alloc]initWithAge:22 addname:@"li"];
        Person *p3=[[Person alloc]initWithAge:20 addname:@"zhang"];
        NSArray *[email protected][p1,p2,p3];

        NSSortDescriptor *d1=[NSSortDescriptor sortDescriptorWithKey:@"age" ascending:YES];
        //把d1转换成NSArray后传给下面用
        NSArray *[email protected][d1];
        //利用以下方法,但是它需要一个NSArray值
        arr1=[arr1 sortedArrayUsingDescriptors:tmp1];
        NSLog(@"%@",arr1);

        //如果有多个呢?比如下面,则是哪个在前面,哪个优先级高先按照它排序,即d2在前面,先按照d2的排序
        NSSortDescriptor *d2=[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES];
        NSArray *[email protected][d2,d1];
    }
    return 0;
}

(4)用block方法排序

        NSArray *[email protected][@"2",@"a",@"z"];
        arr2=[arr2 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            //升序排列
            return [obj1 compare:obj2];
            //降序排列
            return [obj2 compare:obj1];
        }];
        NSLog(@"%@",arr2);
        //如果是一个对象,那么用这个对象里面的成员变量来比较,借用上面的arr1
        arr1=[arr1 sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
            Person *p1=obj1;
            Person *p2=obj2;
            return[p1.name compare:p2.name];
        }];

(5)虽然定义了可变数组,但是不能在增强for循环中(for...in那种),使用[arr1 removeObject:str1]之类的删除操作,否则会导致崩溃。也就是说不能用增强for循环遍历这个数组的同时还删除这个数组的元素。可以把需要删除的元素放到一个临时数组中,然后遍历这个临时数组的同时把要删除的元素取出来当做参数给原数组,然后原数组删除这个元素。

(6)NSSet相比于NSArray是无序的,而且最重要的时:NSSet里面不能存储重复的数据,可以用这个特性去除重复元素。同样集合NSSet也有可变集合NSMutableSet。

(7)不可变的数组字典和集合都可以转化成可变的。直接在创建可变数组字典集合时候利用initWith...方法把不可变的值传递进去,如NSMutableArray *muarr1=[NSMutableArray arrayWithArray:arr1]把arr1转换成可变的。

(8)利用setWithArray把数组转换成集合。利用字典的allValues和allKeys可以转换成数组。利用字符串的componentsSeparatedByString:把字符串按特定字符为分割点转换成多个数组。

(9)当数组利用[arr1 addObject:p]添加一个对象时,会对这个对象进行一次retain操作。利用[arr1 removeObject:p]删除一个对象时,会release一次这个对象。由此可知,我们用removeAllObjects时,会被数组里面所有对象release一次。而且我们在销毁数组本身时候也会对其内部所有对象release一次,如[arr1 release];。

时间: 2024-10-03 02:28:40

【OC加强】枚举介绍、数组的排序、对象的排序、如何利用block排序以及一些数据类型知识的相关文章

数组内的对象按照2个属性进行排序

<!DOCTYPE html> <html> <head lang="en"> <meta charset="UTF-8"> <title></title> </head> <body> 数组内的对象按照2个属性进行排序(先按time从大到小排序,再按weight从大到小排序),请查看控制台看输出结果:<br/> var array = [<br/>

用vector容器代替数组 ——使用数组初始化vector对象

在C++中,我们不能用数组直接初始化另一数组,而只能创建新的数组,然后显式的把原数组的元素逐个复制给新的数组. 按照C语言中的做法: const size_t arry_size=6; int int_arry[arry_size]={0,1,2,3,4,5}; int int_arry2[arry_size]; for(size_t ix=0;ix<arry_size;++i)        int_arry2[ix]=int_arry[i]; 而使用数组初始化vector对象,可以直接利用一

OC 之字典/数组混合使用(删除元素 描述器排序)

注:字典在数组内排序用描述器排序,遍历用字典对象输出!!!!!! NSArray *[email protected][@{@"name":@"Tim Cook",@"age":@"24",@"sex":@"female",@"score":@"89"},@{@"name":@"Jony Ive",@&quo

对数组中的对象进行升序以及降序的排序方法(其中对象类型是系统类型).

[cpp] view plaincopyprint? <span style="font-size:32px;">NSArray *arr = [[NSArray alloc] initWithObjects:@"aa",@"bb",@"cc",@"dd",@"ee",@"ff", nil]; //1.对数组进行升序排序 //sortedArrayUsin

Java枚举介绍及使用详解

在实际编程中,往往存在着这样的"数据集",它们的数值在程序中是稳定的,而且"数据集"中的元素是有限的. 例如星期一到星期日七个数据元素组成了一周的"数据集",春夏秋冬四个数据元素组成了四季的"数据集". 在java中如何更好的使用这些"数据集"呢?在jdk1.5之前我们或许会这样写: static class Grade { private Grade() { } public static final G

黑马程序员————数组工具类对象建立

今天学习了数组工具类对象的建立巩固掌握以前学习的语句,函数,数组等相关知识 /** 建立一个用于操作数组的工具类,其中包括者常见的对数组操作的函数,如:最值,排序等 @author lostnotes */ public class ArraryTool { private ArrayTool () {}//该类中的方法都是静态的,所以不需要创建对象. //为了保证其他成员不创建该类对象,可以构造函数私有化. } /** 获取整数类型数组的最大值 @param arr 接收一个元素为int类型的

《C++ Primer》 对象、数组、基于对象设计、泛型设计

数组 C++ 不支持数组的抽象 abstraction 也不支持对整个数组的操作我们有时会希望对整个数组进行操作例如把一个数组赋值给另外一个数组对两个数组进行相等比较或者想知道数组的大小 size 例如给出两个数组我们不能用赋值操作符把一个数组拷贝到另一个中去. int array0[ 10 ], array1[ 10 ]; array0 = array1;  // error 数组类型本身没有自我意识它不知道自己的长度我们必须另外记录数组本身的这些信息. 数组和指针的关系: int ia[]

javascript 判断变量 是否为空null,undefined, 空数组,空对象(空Object),字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false。

javascript 判断变量 是否为空null,undefined, 空数组,空对象,空Object,字符串是否为空或全由空白字符组成,数字是否为0,布尔是否为false.由于Object没有length用 Object.keys()适用于数组,对象 返回可枚举的实例属性名组成的数组来判断是否为空. 利用逻辑判断中or (||)只要有一项为真则不再计算下一个表达式 来实现不管传入的参数是何种类型.只要符合我对空的定义即返回true. 1 function IsNothing(e) { 2 va

Java笔记(07):常见对象--StringBuffer、二分查找及排序算法

1.StringBuffer类的构造方法 1 package cn.itcast_01; 2 3 /* 4 * 线程安全(多线程讲解) 5 * 安全 -- 同步 -- 数据是安全的 6 * 不安全 -- 不同步 -- 效率高一些 7 * 安全和效率问题是永远困扰我们的问题. 8 * 安全:医院的网站,银行网站 9 * 效率:新闻网站,论坛之类的 10 * 11 * StringBuffer: 12 * 线程安全的可变字符串. 13 * 14 * StringBuffer和String的区别? 1