关于用Objective-C对NSMutableArray集合里面的数据进行排序的问题

有一串数据:"k123","k14", "a17","a17+100","a19","a60","a83","a105+100","a109+120","a109+110","a109","a109+500"
存储在一个NSMutableArray集合里面,如何进行排序并输出成一个新集合啊?
排序规则:(a17>k16,a17+100>a17+90,a17+100>a17)
注:我将array里面的数据取出来封装成NSNumber对象后用冒泡排序进行比较要报错。给出详细代码的我会加分哈!
k123和k14打错了,应该是a123和a14,即都是“a”前缀开头,不好意思!
最新回答
一枝沈荼

2024-04-11 12:12:13

-(void)test


{


    //建立一个block,用来描述比较条件


    NSComparator cp=^(NSString * obj1,NSString * obj2)


    {


        //首先,将字母a去掉


        obj1=[obj1 substringFromIndex:1];


        obj2=[obj2 substringFromIndex:1];


        //然后,使用@“+”进行对字符串进行分割


        NSArray * arr1=[obj1 componentsSeparatedByString:@"+"];


        NSArray * arr2=[obj2 componentsSeparatedByString:@"+"];


        //判断第一个数谁大


        if ([arr1[0] integerValue]<[arr2[0] integerValue])


        {


            return NSOrderedAscending;


        }


        else if([arr1[0] integerValue]>[arr2[0] integerValue])


        {


            return NSOrderedDescending;


        }


        else//第一个数相同,就比较第二个数


        {


            //有可能数组里面只有一个元素,不可直接取第二个数


            if (arr1.count==1)


            {


                if (arr2.count==1)


                {


                    return NSOrderedSame;


                }


                else


                {


                    return NSOrderedAscending;


                }


            }


            else


            {


                if (arr2.count==1)


                {


                    return NSOrderedDescending;


                }


                else


                {


                    if([arr1[1] integerValue]>[arr2[1] integerValue])


                    {


                        return NSOrderedAscending;


                    }


                    else if([arr1[1] integerValue]>[arr2[1] integerValue])


                    {


                        return NSOrderedDescending;


                    }


                    else


                    {


                        return NSOrderedSame;


                    }


                }


            }


        }


        


        




    };


    NSArray * arr=@[@"a123",@"a14", @"a17",@"a17+100",@"a19",@"a60",@"a83",@"a105+100",@"a109+120",@"a109+110",@"a109",@"a109+500"];


    arr= [arr sortedArrayUsingComparator:cp];


    for (NSString *obj in arr)


    {


        NSLog(@"%@",obj);


    }


//    2014-02-21 17:15:38.652 SortArrayDemo[2867:70b] a14


//    2014-02-21 17:15:38.652 SortArrayDemo[2867:70b] a17


//    2014-02-21 17:15:38.652 SortArrayDemo[2867:70b] a17+100


//    2014-02-21 17:15:38.653 SortArrayDemo[2867:70b] a19


//    2014-02-21 17:15:38.653 SortArrayDemo[2867:70b] a60


//    2014-02-21 17:15:38.654 SortArrayDemo[2867:70b] a83


//    2014-02-21 17:15:38.654 SortArrayDemo[2867:70b] a105+100


//    2014-02-21 17:15:38.654 SortArrayDemo[2867:70b] a109


//    2014-02-21 17:15:38.655 SortArrayDemo[2867:70b] a109+120


//    2014-02-21 17:15:38.655 SortArrayDemo[2867:70b] a109+110


//    2014-02-21 17:15:38.656 SortArrayDemo[2867:70b] a109+500


//    2014-02-21 17:15:38.656 SortArrayDemo[2867:70b] a123


    


}

直接用正则表达式把所有数字匹配出来,再做比较应该是比较好的。
薄荷凉我心

2024-04-11 08:43:08

Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。

Objective-C的数组比C++,Java的数组强大在于,NSArray保存的对象可以是不同的对象。但只能保存对象,int ,char,double等基本数据类型不能直接保存,需要通过转换成对象才能加入数组。
⌒小污見ノ大污

2024-04-11 00:47:26

// 你没有表述清楚 a15+3 和a16+2 怎么比较呢 或者 16和a15呢
// 下面是忽略了a的值的算法
// 不清楚的到qq群209798263问

char * a_char[] = {"a123","a14","a17","a17+100","a19","a60","a83","a105+100","a109+120","a109+110","a109","a109+500"};
NSMutableArray *arr = [NSMutableArray array];

for (int i = 0; i < 12; i++) {
NSString *s = [NSString stringWithCString:a_char[i] encoding:NSUTF8StringEncoding];
[arr addObject:s];
}

NSLog(@"older arr = %@", arr);

NSArray *newArr = [arr sortedArrayUsingComparator:^NSComparisonResult(id obj1, id obj2) {
NSString *s1 = (NSString *)[[obj1 copy] lowercaseString];
NSString *s2 = (NSString *)[[obj2 copy] lowercaseString];

s1 = [s1 stringByReplacingOccurrencesOfString:@"a" withString:@""];
s2 = [s2 stringByReplacingOccurrencesOfString:@"a" withString:@""];

s1 = [s1 stringByReplacingOccurrencesOfString:@" " withString:@""];
s2 = [s2 stringByReplacingOccurrencesOfString:@" " withString:@""];

NSArray *arr1 = [s1 componentsSeparatedByString:@"+"];
NSArray *arr2 = [s2 componentsSeparatedByString:@"+"];

float value1 = 0;
for (NSString *s in arr1) {
value1 += [s floatValue];
}

float value2 = 0;
for (NSString *s in arr2) {
value2 += [s floatValue];
}

if (value1 > value2) {
return NSOrderedDescending;
}

if (value1 >= value2 && value1 <= value2) {
return NSOrderedSame;
}

return NSOrderedAscending;
}];

NSLog(@"new arr = %@", newArr);
余安

2024-04-11 01:19:27

NSNumber不能做这种比较吧,只是基本类型的对象,你这个应该要重写compare方法的,OC具体怎么做就不清楚了