用不同方法为国家名称排序(调用block变量实现)

 1 //
 2 //  main.m
 3 //  block的实际应用
 4 //
 5 //  Created by LongMa on 15/9/2.
 6 //  Copyright (c) 2015年 Dast. All rights reserved.
 7 //
 8
 9 #import <Foundation/Foundation.h>
10 #import "Countries.h"
11 int main(int argc, const char * argv[])
12 {
13     char* countries[] = {"Uk","Korean","China","Japan","Autralia","Vietnam","Germany"};
14     int length = sizeof(countries) / sizeof(countries[0]);
15     __block unsigned long num1;
16     __block unsigned long num2;
17
18     Countries *c1 = [Countries new];
19
20     NSLog(@"国家名称按长度排序如下:");
21     [c1 sortWithCountries:countries andLength: length withBlock:^BOOL(char *str1, char *str2)
22     {
23         num1 = strlen(str1);
24         num2 = strlen(str2);
25
26         //汗,放减法溢出,以后unsigned 类型做减法时,记得用int强转参与减法运算的数据。
27         return (int)num1 - (int)num2 > 0 ;
28     }];
29
30     [c1 showCountries:countries WithLength:length];
31
32     NSLog(@"国家名称按字典序排序如下:");
33     [c1 sortWithCountries:countries andLength: length withBlock:^BOOL(char *str1, char *str2)
34      {
35          return  strcmp(str1, str2) > 0;
36      }];
37      [c1 showCountries:countries WithLength:length];
38
39     return 0;
40 }
1 //
2 //  Countries.h
3
4 #import <Foundation/Foundation.h>
5 typedef BOOL(^cmpBlock) (char*,char*);
6 @interface Countries : NSObject
7 - (void)sortWithCountries:(char*[])countries andLength:(int)length withBlock:(cmpBlock)cmpB;
8 - (void)showCountries:(char*[])countries WithLength:(int)length ;
9 @end
 1 //
 2 //  Countries.m
 3
 4 #import "Countries.h"
 5 #import <string.h>//别忘了
 6
 7 @implementation Countries
 8
 9 //char* 后面必须有[],是字符指针数组,不是字符指针,而(char*)[]是指向数组的指针,不对!    cmpB:block变量,传入比较方法的代码
10 - (void)sortWithCountries:(char*[])countries andLength:(int)length withBlock:(cmpBlock)cmpB
11 {
12     for (int i = 0; i < length - 1; i++)//冒泡排序
13     {
14         for (int j = 0; j < length - 1 - i; j++)
15         {
16             //int res = strcmp(countries[j], countries[j + 1]);//在这换为block
17            BOOL res = cmpB(countries[j],countries[j + 1]);//block自定义的返回值为 BOOL
18             if (YES == res )
19             {
20                 char* temp = countries[j];
21                 countries[j] = countries[j + 1];
22                 countries[j +1] = temp;
23             }
24         }
25     }
26 }
27
28 - (void)showCountries:(char*[])countries WithLength:(int)length
29 {
30     for (int i = 0; i < length; i++)
31     {
32         NSLog(@"%s",countries[i]);
33     }
34 }
35 @end

运行结果如下:

ps:bug分析。unsigned long类型属性相减会溢出的问题,检查了好久,同桌和辅导员都没有解决!最后自己不断验证才发现是溢出了,

      以后遇见这种情况,做减法前都 强转为int 保证负数能正常得出。并用 int类型 变量接收或 与0比较后  用BOOL类型变量接收 即可!

  验证图如下:

时间: 2024-11-04 07:47:03

用不同方法为国家名称排序(调用block变量实现)的相关文章

C#文件和文件文件夹按时间、名称排序-顺序与倒序

对于文件和文件夹有多种排序方式,常用的就是按创建或修改时间.按文件名排序.在 C# 中,按时间和文件名排序都十分简单,用数组提供的排序方法 Array.Sort() 一行代码就可以搞定,当然也可以用常用的排序方法,如快速排序.冒泡排序等. 文件排序的方法也适用于文件夹,只是传递的变量不同.为了便于使用,将分别列出C#文件排序和文件夹排序四种常用方法,分别为:按名称顺序与倒序排序.按时间顺序与倒序. 一.C#文件排序 1.按名称顺序排列 /// <summary> /// C#按文件名排序(顺序

用block变量来对字符数组对象进行排序

<span style="font-size:18px;">降序排序</span> <span style="font-size:18px;">NSMutableArray *arr = [NSMutableArray arrayWithObjects:@"abc",@"bcd",@"123",@"9987", nil]; NSComparisonRe

按名称排序

2014年7月8日23:31:59 今天要下班的时候,本来兴致满满,不用加班,终于可以回家喝绿豆汤的那一刻,测试妹子提了一个捉急的需求.. 一级部门要按照固定部门的顺序排序,如果没有,就放在最后面. 一瞬间,我满满的回家热情就被浇灭了.闲话少扯,下面步入正题. 具体需求:按“合众媒体”,“合众互动”,“合众娱乐”,“服务中心”的顺序把一级部门排序,不在这四个里面的放在最后面. 最开始想到的是写在数组里,然后循环找到它的位置进行排序,但是循环..还是尽量少用,哗哗的效率问题,最后灵机一动,突然机智

php文件管理,可以点击按照时间,大小,名称排序

php文件管理,可以点击按照时间,大小,名称排序 本例没有用到jquery 演示 PHP Code <?php $rootdir="./"; $spacenum=0; $filenum=0; $allfilesize=0; echo "<h1>文件管理freejs.net测试</h1>"; echo "<a href=''>重置</a>"; readLogDir($rootdir); echo

C# 模拟windows文件名称排序(使用windows自带dll)

[DllImport("shlwapi.dll", CharSet = CharSet.Unicode)] private static extern int StrCmpLogicalW(string psz1, string psz2); /// <summary> /// 根据路径查到文件,按文件名称排序,智能排序,非ASCII码排序 /// </summary> /// <param name="pathToVersions"&

block 解析 - block变量

block变量 上一篇 讲的是block静态变量的特性,这里我们来看一下_block变量.引用官方: You can specify that an imported variable be mutable—that is, read-write— by applying the __block storage type modifier. __blockstorage is similar to, but mutually exclusive of, the register, auto, a

Block变量的的用法,使你的程序看起来清晰明了!

<span style="font-size:24px;">为什么要使用block变量呢? 因为当我们的程序比较繁杂的时候,我们在一个函数中要调用一个函数,还需要在外边来定义,实现,很不方便,但是有了block变量我们就可以在一个函数的内部来定义一个block变量,相当于又在函数的内部来定义了一个函数. int (^max)(int x,int y) = ^(int x,int y)//求两个数的最大值 { return x > y ? x :y; }; NSLog(

&quot;静态方法里只能调用静态变量和静态方法&quot;详解

静态方法里可以调用静态方法和静态变量,同时也能调用非静态方法和非静态变量. public class Test { public Test() {}; public Test(int i) {this.n = i;} public static int m = 5; public int n = 10; public void fun1() {System.out.println("非静态方法fun1");} public static void fun2() {System.out.

(转)DedeCms Runphp 标签中调用其他变量的方法

DedeCms Runphp 标签中调用其他变量的方法 我们都知道,在DedeCMS中是可以使用PHP的,常见的方法就是if else了,例如模板制作中,我们需要对来源和作者进行判断,如果为空,则提示:暂无或不详,样例: {dede:field name='source' runphp='yes'}if(@me == "") @me = "";else @me = "来源:"[email protected];{/dede:field} 但是如果