Objective-C,基于对象实例变量对数组进行排序。

Objective-C,基于对象实例变量对数组进行排序。,objective-c,arrays,sorting,cocos2d-iphone,nsmutablearray,Objective C,Arrays,Sorting,Cocos2d Iphone,Nsmutablearray,我正在做一个类似啮齿动物复仇的游戏,只是想指出我这个问题的来历。我也在使用cocos2d游戏引擎 我有一个包含168个块的图层,这些块是精灵的一个子类。每个块包含两个整数实例变量,一个用于xGridLocation,另一个用于yGridLocation。我调用了一个方法,该方法返回一个数组,其中包含与主控字符(鼠标)位于同一x或y行上的所有块。只要块保持相同的顺序(从最小的x/y值到最大的x/y值),这种方法就可以工作,但是当我开始将块从原始行中推出并稍微混合它们时(在玩游戏时)我的逻辑不再有效

我正在做一个类似啮齿动物复仇的游戏,只是想指出我这个问题的来历。我也在使用cocos2d游戏引擎

我有一个包含168个块的图层,这些块是精灵的一个子类。每个块包含两个整数实例变量,一个用于xGridLocation,另一个用于yGridLocation。我调用了一个方法,该方法返回一个数组,其中包含与主控字符(鼠标)位于同一x或y行上的所有块。只要块保持相同的顺序(从最小的x/y值到最大的x/y值),这种方法就可以工作,但是当我开始将块从原始行中推出并稍微混合它们时(在玩游戏时)我的逻辑不再有效,因为它基于这样一个事实:数组中的块根据其xGridLocation或yGridLocation从最小到最大进行索引。xGridLocation和yGridLocation不基于它们的位置,当图层首次加载时,它们被指定为预设网格位置,并且当块沿任何方向移动时,网格位置会根据它们移动的方向进行更改

我的问题是,在根据实例变量xGridLocation或yGridLocation按顺序返回数组之前,如何对数组进行排序。我正在考虑使用sortUsingSelector:@selector(compareValues:)方法,但不确定如何实现将进行排序的compareValues方法

这是我用来获取块数组的方法

//I have another one for x. The y parameter is the mouses y value.
-(NSMutableArray *)getBlocksForY:(int)y
{
 NSMutableArray *blocks = [[NSMutableArray alloc] init];

 int tagNum = 0;

        //tagNum starts at 0, and goes up to 168, the numer of children (blocks) on
        //this layer...

 for(tagNum; tagNum<=168; tagNum++)
 {
  BlueBlock *currentBlock = (BlueBlock *)[self getChildByTag:tagNum];
  int currentY = [currentBlock getBlockLocationY];

                //Checks to see if the current block has same y value as the mouse, if
                //so it adds it to the array.
  if(currentY == y)
  {
   [blocks addObject:currentBlock];
  }
 }

        //I want to sort before returning...
 return blocks;
}
//我还有一个给x的。y参数是鼠标的y值。
-(NSMutableArray*)getBlocksForY:(int)y
{
NSMUTABLEARRY*块=[[NSMUTABLEARRY alloc]init];
int-tagNum=0;
//tagNum从0开始,上升到168,即屏幕上的子(块)数
//这一层。。。

对于(tagNum;tagNum,如NSMutableArray参考中所述:

将比较器消息发送到每个 对象,并将其作为 单个参数是另一个对象 数组。比较器方法应 如果 接收者比论点小, 如果接收器是 比论据大,而且 如果它们相等,则重新命名

所以您的比较器应该是这样的,并且应该添加到
BlueBlock
类中:

- (NSInteger) compareBlocks:(BlueBlock)block
{
     if ([self getBlockLocationX] < [block getBlockLocationX])
          return NSOrderedAscending;
     else if ([self getBlockLocationX] == [block getBlockLocationX])
     {
          if ([self getBlockLocationY] < [block getBlockLocationY])
              return NSOrderedAscending;
          else if ([self getBlockLocationY] == [block getBlockLocationY])
              return NSOrderedSame;
          else
              return NSOrderedDescending;
     }
     else
         return NSOrderedDescending;
 }
-(NSInteger)比较块:(BlueBlock)块
{
如果([self-getBlockLocationX]<[block-getBlockLocationX])
回报率下降;
else if([self-getBlockLocationX]==[block-getBlockLocationX])
{
如果([self GetBlockLocation]<[block GetBlockLocation])
回报率下降;
else if([self getBlockLocationY]==[block getBlockLocationY])
返回指定名称;
其他的
退而求其次;
}
其他的
退而求其次;
}

如NSMutableArray参考中所述:

将比较器消息发送到每个 对象,并将其作为 单个参数是另一个对象 数组。比较器方法应 如果 接收者比论点小, 如果接收器是 比论据大,而且 如果它们相等,则重新命名

所以您的比较器应该是这样的,并且应该添加到
BlueBlock
类中:

- (NSInteger) compareBlocks:(BlueBlock)block
{
     if ([self getBlockLocationX] < [block getBlockLocationX])
          return NSOrderedAscending;
     else if ([self getBlockLocationX] == [block getBlockLocationX])
     {
          if ([self getBlockLocationY] < [block getBlockLocationY])
              return NSOrderedAscending;
          else if ([self getBlockLocationY] == [block getBlockLocationY])
              return NSOrderedSame;
          else
              return NSOrderedDescending;
     }
     else
         return NSOrderedDescending;
 }
-(NSInteger)比较块:(BlueBlock)块
{
如果([self-getBlockLocationX]<[block-getBlockLocationX])
回报率下降;
else if([self-getBlockLocationX]==[block-getBlockLocationX])
{
如果([self GetBlockLocation]<[block GetBlockLocation])
回报率下降;
else if([self getBlockLocationY]==[block getBlockLocationY])
返回指定名称;
其他的
退而求其次;
}
其他的
退而求其次;
}

大约半小时前在这里回答:大约半小时前在这里回答:谢谢你,只是为了我的需要对它进行了一些调整,工作得很好!:D很高兴能发挥作用!但是如果答案正确,不要忘了勾选答案。.谢谢你,只是为了我的需要对它进行了一些调整,工作得很好!:D很高兴能发挥作用!但别忘了如果答案正确,请勾选。。