美文网首页 移动 前端 Python Android Java
3大数据结构类之——字符串(一)

3大数据结构类之——字符串(一)

作者: 我開始方了 | 来源:发表于2016-05-21 19:38 被阅读395次

前言

OC程序必须依托于Foundation框架,Foundation框架其实就是一个类库。它包含了许多iOS/OS X开发中所必须的类。其中有3个数据结构类:字符串、数组和字典。本文就字符串类做相关讨论。

oc中的字符串 , 于给ios/mac 下应 程序服务.往后的ios/OS X应 程序开发,都使 oc字符串。

一.创建一个字符串对象:

 //字面量语法,推荐这种语法,简单直观
        //1.注意类名之后跟着*说明str1是一个指针,它指向"hello world!"(对象)所在的内存,为什么加@,@表示它是一个对象
        NSString * str1 = @"hello world!";
        //%p用来打印地址,%@用以打印对象
        //注:本例打印的地址是笔者电脑上的地址,不同的地址可能不一样
        NSLog(@"str1(%p) : %@",str1,str1);// str1(0x100001040) : hello world!
        
        //2.创建一个NSString类的空的对象
        NSString * str2 = [[NSString alloc]init];
        //
        //str2 = @"hello world!";//str2(0x100001040) : hello world!
        //注意到str1和str2的地址是一样的了么?为什么呢?因为@"hello world!"这个对象的地址只会被分配一次,在数据区。
        str2 = @"How are you!";
        NSLog(@"str2(%p) : %@",str2,str2);
        
        //3.通过实例化方法创建字符串对象
        NSString * str3 = [[NSString alloc]initWithString:@"hello world"];
        NSLog(@"str3(%p) : %@",str3,str3);//str3(0x1000010c0) : hello world
        //str3和str1都是指向hello world 的对象,为什么地址不一样呢?因为alloc会在堆区为对象申请一块空间
        
        //4.根据C语言字符串创建OC字符串
        //4.1通过构造方法
        const char * p = "Come on!";
        NSString *str4 = [[NSString alloc]initWithCString:p encoding:NSUTF8StringEncoding];
        NSLog(@"str4(%p) : %@",str4,str4);//str4(0x100109520) : Come on!
        //4.2通过类方法创建对象
        NSString * str5 = [NSString stringWithUTF8String:p];
        NSLog(@"str5(%p) : %@",str5,str5);//str5(0x1005003b0) : Come on!
        //创建格式化的字符串
        NSString *str6 =[NSString stringWithFormat:@"%@ %@",str1,str2];
        NSLog(@"str6(%p) : %@",str6,str6);//str6(0x100700120) : hello world! How are you!
        
        //通过类方法创建,str5、str6都是通过类方法创建的字符串
        NSString * str7 = [NSString stringWithString:@"hello world"];

二.字符串常用方法

1.比较字符串

1.1是否相等

//isEqualToString方法判断两个字符串是否相等,相等返回1,否则返回0
    NSString * str1 = @"this is a string";
    NSString * str2 = @"this is a string";
    BOOL ret = [str1 isEqualToString:str2];
    if(ret){
        NSLog(@"str1 = str2");
    }else{
        NSLog(@"str1 ≠ str2");
    }
    //str1 = str2,如果对其中一个字符串稍作改动就会得到str1 ≠ str2

1.2比较字符串大小

//compare方法比较大小,返回值是一个枚举typedef NS_ENUM(NSInteger, NSComparisonResult) {NSOrderedAscending = -1L, NSOrderedSame, NSOrderedDescending};分别为升序,相等、降序
        NSString *astring01 = @"This is a String!";
        NSString *astring02 = @"This is a String!";
        BOOL result = [astring01 compare:astring02] == NSOrderedSame;//0
        NSLog(@"result:%d",result);// result:1,说明是相等的,其他两种就不一一的试了,原理是一样的

1.3不考虑大小写比较字符串大小,

//caseInsensitiveCompare方法
        NSString *astring1 = @"this is a String!";
        NSString *astring2 = @"This is a String!";
        BOOL result = [astring1 caseInsensitiveCompare:astring2] ==  NSOrderedSame;
    NSLog(@"result:%d",result);//result:1

2.大小写转换

    //先得到一个要转换的字符串
    NSString * string = @"This is A String";

    //2.1小写转换大写
    NSString *lString = [string uppercaseString];
    NSLog(@"lString = %@",lString);//LString = THIS IS A STRING
    //那么原来的字符串有没有变化呢?
    NSLog(@"string = %@",string);//string = This is A String
    //这说明原来的字符串不会发生变化,LString是一个新的字符串

    //2.2大写转小写
    NSString *sString=[string lowercaseString];
    NSLog(@"sString = %@",sString);//sString = this is a string
    //2.3首字母大写
    NSString *cString = [sString capitalizedString];
    NSLog(@"cString = %@",cString);//cString = This Is A String

3.字符串搜索

//rangeOfString
//在已知字符串(父串)中查找某个单词或者某一句话(子串)的范围
NSString *fatherString = @"I'm a iOS programmer";
NSString *sonString = @"iOS";
//定义一个结构体NSRange,range表示子串在父串中的范围(起始位置,和长度)
//注意这个方法的两个参数分别是父串、子串
NSRange range = [fatherString rangeOfString:sonString];
NSUInteger location = range.location;
NSUInteger length = range.length;
NSLog(@"%lu,%lu",location,length);//当不存在子串时,location的值是一个非常大的值,笔者电脑上是9223372036854775807,length的值为0
//输出结果6,3;表示是子串(iOS)在父串中的位置是下标为6开始,持续3个长度,注意在计算机系统中的下标都是从0开始的

4.抽取子串,必须有父串

//方法1.从开头位置开始,截取到某个位置为止:substringToIndex
NSString *fatherString = @"Hello , I'm a iOS programmer!";
NSString * string01 = [fatherString substringToIndex:12];
NSLog(@"string01 = %@",string01);//string01 = Hello , I'm ,注意最后有一个空格“a”是第12个位置上的字符,可见这个方法是不包括给定位置的

//方法2.从指定为止开始,截取到最后,substringFromIndex,这个方法是包括指定位置的
NSString * string02 = [fatherString substringFromIndex:12];
NSLog(@"string02 = %@",string02);//string02 = a iOS programmer!

//方法3.截取指定范围的字符串substringWithRange,这个方法的参数是一个NSRange,前面说了,它是一个结构体,怎么构造一个结构体呢?
//OC中凡是结构体,都有对于的NSMake方法可以构造
NSString * string03 = [fatherString substringWithRange:NSMakeRange(5, 10)];
NSLog(@"string03 = %@",string03);//string03 =  , I'm a i

5.判断字符串的前缀、后缀

//这个方法在后期的文件操作中经常用到
//比如有个"iOS.txt"文件
NSString * pathString = @"iOS.txt";
//- (BOOL) hasPrefix: (NSString *)  aString;
//判断前缀是否是iOS,返回只是一个BOOL类型
//三目运算符?:,?之前的条件位置,执行:之前的语句,否则执行:后面的语句
[pathString hasPrefix:@"iOS"]?NSLog(@"YES"):NSLog(@"NO");//YES
//判断后缀+ (BOOL) hasSuffix: (NSString *)  aString;
[pathString hasSuffix:@"txt"]?NSLog(@"YES"):NSLog(@"NO");//YES

字符串先告一段落,本篇讲的是不可变字符串,当然还有其他方法,笔者不一一赘述了,有兴趣的可以自己去研究一下,下一篇将讨论可变字符串可变字符串


喜欢的话,帮忙点一下喜欢,谢谢!
如果有错误之处或者偏差,还请斧正!
欢迎大家留言提问,技术要交流才能更快成长!

相关文章

  • 2020-07-21前端学习

    for of 只最拥有 Symbol.iterator 的数据结构起作用数组new Set类数组字符串.......

  • Python算法之旅字符串游戏之拼接字符串

    字符串游戏之拼接字符串 小美:阿福,最近老师教了我们一种很实用的Python数据结构——字符串,他说Python的...

  • Python数据结构之字符串

    数据结构之字符串类型 本节知识体系 字符串语法 输入和输出 注释与长字符串 原始字符串 转义与转义字符 字符串的格...

  • Redis 数据结构之SDS

    Redis 数据结构之SDS 简单动态字符串 为了实现对于字符串的高效操作,Redis 自己构建的一种名为简单动态...

  • 常用工具类

    待整理 编码习惯之工具类规范Java 编程技巧之数据结构 概述 工具类的选择顺序:语言自带(java)>专用工具类...

  • redis 数据结构

    String 数据结构 示例 这里就可以存储"Redis C",而C只能读取Redis字符串 对C字符串和SDS之...

  • 3大数据结构类之——字符串(一)

    前言 OC程序必须依托于Foundation框架,Foundation框架其实就是一个类库。它包含了许多iOS/O...

  • 第二章:API 的理解和使用-字符串

    2.2 字符串 字符串类型是Redis最基础的数据结构。首先键都是字符串类型,而且其他几种数据结构都是在字符串类型...

  • Set 和 Map

    Set 介绍 类似数组,新的数据结构,成员的值唯一 可以添加数组、类数组、字符串(或者说是具有 iterable ...

  • 01-redis数据结构与对象

    3. redis数据结构与对象 redis对外支持数据结构 字符串 (string) 字符串列表(list) 字符...

网友评论

    本文标题:3大数据结构类之——字符串(一)

    本文链接:https://www.haomeiwen.com/subject/eswnrttx.html