A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 杨贺阳 中级黑马   /  2014-12-21 14:05  /  3600 人查看  /  19 人回复  /   1 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 杨贺阳 于 2014-12-21 14:07 编辑

      利用分类给NSString扩展3个方法(Objective-C)
1>    字符串反转(比如@”123”调用方法后返回@”321”)
2>    计算英文字母的个数(比如@”5435abc54abc3AHJ5”调用方法后返回的是9)
3>    去除字符串两端空格(比如@”  1235 45 ”调用方法后返回@”1235 45”)
  1. #import <Foundation/Foundation.h>
  2. @interface NSString( MJ )// 方法声明
  3.    +(int)letterCount: (NSMutableString *)s1;
  4.    +(NSMutableString *)qukongge:(NSMutableString *)s1;                     
  5. @end

  6. @implementation NSString( MJ )// 方法实现         
  7.    +(int)letterCount: (NSMutableString *)s1
  8. {
  9.      int  count = 0;
  10.      for (int i=0 ;i<self.length;i++)
  11.         {
  12.         unichar  c = [self characterAtIndex :i];
  13.         if(( c>='65'&& c<='90')||(c>='97'&& c<='122'))
  14.                 {
  15.                 count++;
  16.                 }
  17.         }
  18.         return count;
  19. }   

  20. +(NSMutableString *)qukongge:(NSString *)s1
  21. {
  22.         NSMutableString *newS1 = [NSMutableString stringWithString:s1];
  23.         NSMutableString *temp = nil ;
  24.         for(int i =0; i < self.length; i++)  
  25.         {      
  26.                 char c = [newS1  characterAtIndex:i]; // 获取当前位置的字符
  27.                 if(c == ' ')
  28.                 {
  29.                 temp = [newS1  deleteCharactersInRange:NSMakeRange(i, 1)];
  30.                 }
  31.                 else  break;
  32.            }  
  33.         for(int k = self.length -1; k >= 0; k--)  
  34.         {   
  35.                 char c2 = [newS1  characterAtIndex:i]; // 获取当前位置的字符
  36.                 if(c2 == ' ')
  37.                 {
  38.                 temp = [newS1  deleteCharactersInRange:NSMakeRange(k, 1)];
  39.                 }
  40.                 else  break;
  41.            }
  42.         return temp;         
  43. }                  
  44. @end

  45. int main ()
  46. {   NSMutableString *s1 = @"  12aaabbb35 45 ";
  47.     NSMutableString *s2 = [NSString qukongge: s1];
  48.    int   count = [NSString letterCount: s1] ;
  49.     NSLog(@"去空格后是 %@,字母个数是%@", s2,count);  
  50.     return 0;
  51. }
复制代码


大神们帮我看看,这样做对不对啊,还有第一问不会做,求解!!

19 个回复

倒序浏览
我没有Xcode  ,谁帮我试一下程序结果对不对
回复 使用道具 举报
  1. #import <Foundation/Foundation.h>

  2. @interface NSString (MJ) // 方法声明

  3. + (int)letterCount:(NSString *)s1;
  4. + (NSString *)qukongge:(NSString *)s1;

  5. @end

  6. @implementation NSString (MJ) // 方法实现
  7. // + (int)letterCount:(NSMutableString *)s1
  8. + (int)letterCount:(NSString *)s1
  9. {
  10.     int count = 0;
  11.    
  12.     // for (int i = 0 ;i < self.length; i++) 类方法self是类
  13.     for (int i = 0; i < s1.length; i++)
  14.     {
  15.         unichar  c = [s1 characterAtIndex:i];
  16.         
  17.         // if(( c >= '65' && c <= '90')||(c >= '97' && c <= '122')) '65'啥也不是。'6' '5' "65" 6 5 65 都不一样
  18.         if(( c >= 65 && c <= 90) || (c >= 97 && c <= 122))
  19.         {
  20.             count++;
  21.         }
  22.     }
  23.     return count;
  24. }

  25. + (NSString *)qukongge:(NSString *)s1
  26. {
  27.     NSMutableString *newS1 = [NSMutableString stringWithString:s1];
  28.    
  29.     // NSMutableString *temp = nil;
  30.    
  31.     // for(int i = 0; i < self.length; i++)
  32.     for(int i = 0; i < newS1.length; i++)
  33.     {
  34.         char c = [newS1 characterAtIndex:i]; // 获取当前位置的字符
  35.         
  36.         if(c == ' ')
  37.         {
  38.             // temp = [newS1  deleteCharactersInRange:NSMakeRange(i, 1)]; 这个方法没有返回值的
  39.             [newS1  deleteCharactersInRange:NSMakeRange(i, 1)];
  40.             --i; // 每次删除字符字符串长度都-1 [newS1 characterAtIndex:i]是相对于新长度的 所以i--;抵消影响
  41.         }
  42.         else
  43.             break;
  44.     }
  45.    
  46.     // for(int k = self.length -1; k >= 0; k--)
  47.     for(int k = (int)newS1.length - 1; k >= 0; k--)
  48.     {
  49.         // char c2 = [newS1  characterAtIndex:i]; // 获取当前位置的字符
  50.         char c2 = [newS1  characterAtIndex:k];
  51.         if(c2 == ' ')
  52.         {
  53.             // temp = [newS1  deleteCharactersInRange:NSMakeRange(k, 1)];
  54.             [newS1  deleteCharactersInRange:NSMakeRange(k, 1)];
  55.             --k;
  56.         }
  57.         else  break;
  58.     }
  59.     // return temp;
  60.     return newS1;
  61. }
  62. @end

  63. int main ()
  64. {   // NSMutableString *s1 = @"  12aaabbb35 45 "; 不可变字符串不要这么赋值
  65.     NSString *s1 = @"  12aaabbb35 45 ";
  66.     NSString *s2 = [NSString qukongge:s1];
  67.     int count = [NSString letterCount:s1] ;
  68.     // NSLog(@"去空格后是:%@,字母个数是%@", s2,count);
  69.     NSLog(@"去空格后是:%@,字母个数是:%d", s2, count);
  70.    
  71. //    用 stringByTrimmingCharactersInSet: 方法删除首尾空格 [NSCharacterSet whitespaceCharacterSet] 表示空格的字符集
  72. //    NSString *s3 = [s1 stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
  73. //    NSLog(@"可以直接去空格:%@", s3);
  74.    
  75. //    字符串反转(比如@”123”调用方法后返回@”321”)
  76.     NSString *s4 = @"123";
  77.     NSMutableString *str = [NSMutableString string];
  78.     for (int i = (int)s4.length - 1; i >= 0; --i) {
  79.         [str appendFormat:@"%c", [s4 characterAtIndex:i]];
  80.     }
  81.     NSLog(@"%@", str);
  82.     return 0;
  83. }
复制代码
回复 使用道具 举报 2 0
阿弥陀佛,这就是我当时面试的考题,
回复 使用道具 举报
#import <Foundation/Foundation.h>

@interface NSString (Addition)

+ (NSString *)reverseString:(NSString *)inputStr;
+ (NSInteger)calculateCount:(NSString *)inputStr;
+ (NSString *)deleteSpace:(NSString *)inputStr;

@end


#import "NSString+Addition.h"

@implementation NSString (Addition)

+ (NSString *)reverseString:(NSString *)inputStr
{
    NSMutableString *resString = [NSMutableString string];
    for (NSUInteger i = inputStr.length; i > 0; i--) {
        [resString appendString:[inputStr substringWithRange:NSMakeRange(i-1, 1)]];
    }
   
    return resString;
}

+ (NSInteger)calculateCount:(NSString *)inputStr
{
    NSInteger resCount = 0;
    NSInteger length = [inputStr length];
    for (int i = 0; i < length; i++) {
        unichar tempCh = [inputStr characterAtIndex:i];
        if ((tempCh >= 65 && tempCh <= 90) || (tempCh >= 97 && tempCh <= 122)) {
            resCount++;
        }
    }
    return resCount;
}

+ (NSString *)deleteSpace:(NSString *)inputStr
{
    NSString *resString = [inputStr stringByTrimmingCharactersInSet:[NSCharacterSet whitespaceCharacterSet]];
    return resString;
}

@end
回复 使用道具 举报
把该死的表情换成   冒号右括号
回复 使用道具 举报
shicuf 中级黑马 2014-12-21 22:01:20
7#
杨贺阳 发表于 2014-12-21 14:11
我没有Xcode  ,谁帮我试一下程序结果对不对

回去补一下self的用法
回复 使用道具 举报
小平 来自手机 中级黑马 2014-12-22 15:06:51
8#
谁有全部代码,求带
回复 使用道具 举报
shicuf 中级黑马 2014-12-22 15:08:28
9#
小平 发表于 2014-12-22 15:06
谁有全部代码,求带

我的答案不全?
回复 使用道具 举报
if(( c>='65'&& c<='90')||(c>='97'&& c<='122'))  把单引号去掉 , 65 与 90 是 小写字母的ASCII码 ,  写 if(( c>=65&& c<=90)||(c>=97&& c<=122))  或者 if(( c>='A'&& c<='Z')||(c>='a'&& c<='z'))
回复 使用道具 举报

很实用的回复!!!

去空格那的两个for循环不太懂,,题目要求不是只去除两头的空格嘛,这样写和去掉全部空格有什么不一样吗?  求解答
回复 使用道具 举报
依然0 发表于 2014-12-23 09:30
很实用的回复!!!

去空格那的两个for循环不太懂,,题目要求不是只去除两头的空格嘛,这样写和去掉全 ...

if(c == ' ') {

}
else  break;
只要遇到不是空格的就直接退出循环了,所以不会去除字符串内部的空格。
回复 使用道具 举报
感觉为什么都看不懂的。。。。哎 真心不会
回复 使用道具 举报
zsling 中级黑马 2014-12-23 14:12:56
14#
没有xcode也可以做题吗?如果运行不出来结果呢???
回复 使用道具 举报
小平 中级黑马 2014-12-24 12:10:30
15#
可以 只是看不到结果
回复 使用道具 举报
shicuf 发表于 2014-12-21 21:58
#import

@interface NSString (Addition)

我要是第二批能进。。大神交个朋友可好。。我要当你同桌{:2_36:}
回复 使用道具 举报
shicuf 中级黑马 2014-12-24 16:43:28
17#
liuxuanlin1234 发表于 2014-12-24 16:26
我要是第二批能进。。大神交个朋友可好。。我要当你同桌

:Q,我啥都不会的
回复 使用道具 举报

[newS1  deleteCharactersInRange:NSMakeRange(i, 1)]; 这个方法没有返回值的??
这方法不返回一个新的字符串吗?
回复 使用道具 举报
chasedream 发表于 2014-12-28 15:06
[newS1  deleteCharactersInRange:NSMakeRange(i, 1)]; 这个方法没有返回值的??
这方法不返回一个新的 ...

无返回,可变字符串一般都是直接对自身操作,没有返回值的。
回复 使用道具 举报
学习了。评论收藏一下。
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马