问题排序NSMutableArray

时间:2011-01-16 18:27:50

标签: objective-c sorting nsmutablearray


我知道有很多关于这个主题的问题,我为此道歉,因为我不能让这个为我的NSMutableArray工作。我有问题要真正理解排序,我一直在阅读文档

我有一个NSMutableArray,其中包含以下类型的数据:

  

球员姓名
  得分
  球员姓名
  得分
  球员姓名
  得分
  ...

它是名称和分数(NSNumber)的组合。我试图找到一种方法来根据分数对此进行排序。我已经阅读了很多,但我只是没有让它工作,我也有问题理解排序的概念。我试图对整个数组进行排序,但是......

如果有人可以给我一个简短的,可理解的,对此排序方案的解释以及如何对此进行排序的示例,我将非常感激。

编辑:我改为字典,选择了值并且正在考虑对allObjects进行排序(在dict中存储为NSNumber),然后根据排序的对象从dict中选择键。

NSArray *allPlayers = [playerResultInTheGame allKeys];
NSArray *allObjects = [playerResultInTheGame allValues];

NSLog(@"allPlayers: %@", allPlayers);
NSLog(@"allObjects: %@", allObjects);

NSMutableArray *sortedArray = [allObjects   sortedArrayUsingSelector:@selector(Compare:)];

运行时我得到以下内容:

  

2011-01-16 21:10:08.417 XX [6640:207] playerResultInTheGame:{
      Barnspelare = 3;
      Vuxenspelare = 3;
  }
  2011-01-16 21:10:08.418 XX [6640:207] allPlayers:(
      Barnspelare,
      Vuxenspelare
  )
  2011-01-16 21:10:08.418 XX [6640:207] allObjects:(
      3,
      3
  )
  2011-01-16 21:10:08.419 XX [6640:207] - [NSCFNumber比较:]:无法识别的选择器发送到实例0x5b26f10
  2011-01-16 21:10:08.422 XX [6640:207] * 由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:' - [NSCFNumber Compare:]:无法识别的选择器发送到实例0x5b26f10 '

有人可以请一些建议,因为我真的不明白吗?

2 个答案:

答案 0 :(得分:2)

这里你需要做的是将你的得分和球员名字存储在字典中。使用玩家名称作为键(除非同一玩家被包含多次)并将分数作为值。然后,对球员进行排序就像这样简单:

NSDictionary *dict; // initialize dictionary with key/value pairs
NSArray *allPlayers = [dict allKeys];

根据需要对allPlayers数组进行排序,然后从字典中获取分数。

答案 1 :(得分:0)

Lets go. 

1) You need to create array of dictionaries. 2) Then sort it. 3) Then create final array of strings and numbers from sorted array of dictionaries.    

    //for example you have this

    NSArray *allPlayers = @[@"John",@"Carl",@"Elena",@"Anna"];
    NSArray *allAges    = @[@30,    @25,    @16,     @21];

    //created storage to sort results
   NSMutableArray *sortedPlayers = [NSMutableArray new];

    [allPlayers enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {

        //I do not know if you have same count of player names and ages allways
        //so just to prevent app crash check this situation
        if (allAges.count <= idx){
            *stop = YES;
            return ;
        }

        [sortedPlayers addObject:@{
                           @"name":obj,
                           @"age":allAges[idx]
                           }];
    }];

    //let the sort begin
    [sortedPlayers sortUsingComparator:^NSComparisonResult(id obj1, id obj2) {

        NSNumber *age1 = obj1[@"age"];
        NSNumber *age2 = obj2[@"age"];

        //just leave comparing to the NSNumber object
        return  [age1 compare:age2];
    }];

    NSLog(@"Wow. It works!\n:%@",sortedPlayers);

    //now you need the initial array with player\age values
    NSMutableArray *result = [NSMutableArray new];

    //append each pair to result
     for (NSDictionary *obj in sortedPlayers){

        NSString *name = obj[@"name"];
        NSNumber *age = obj[@"age"];

        [result addObject:name];
        [result addObject:age];
    }

    NSLog(@"The final result is\n:%@",result);

这将在控制台中产生以下结果:

(     埃琳娜,     16,     安娜,     21,     卡尔     25,     约翰,     三十 )