代码之家  ›  专栏  ›  技术社区  ›  Gopal Devra

按特定顺序排序NSArray

  •  0
  • Gopal Devra  · 技术社区  · 9 年前

    我有一个 NSArray 自定义对象的。 每个对象包含一个整数值。 1,2,3,4

    现在我想对数组进行如下排序

    9 7 5 3 1 2 4 6 8
    

    有人能帮我吗?

    1 回复  |  直到 9 年前
        1
  •  0
  •   Tapas Pal    9 年前

    这是你的答案。

    希望您的第一个数组是按排序顺序(升序)排列的,否则您需要先对其排序。

    NSMutableArray *myArray = [NSMutableArray array];
    
    //Populate your array with custom objects. I had created my own which contain an integer type property.
    
    [myArray addObject:[[myObject alloc] initWithId:11 objectName:@"K"]];
    [myArray addObject:[[myObject alloc] initWithId:3 objectName:@"C"]];
    [myArray addObject:[[myObject alloc] initWithId:4 objectName:@"D"]];
    ....
    ...
    .... and so on
    

    然后分类 Ascending 顺序你可以做到的 Descending 但是你需要改变一下下面的逻辑。我展示了 提升 顺序

    NSArray *tempArray = [myArray sortedArrayUsingComparator:^NSComparisonResult(myObject *obj1, myObject *obj2) {
            if([obj1 objectId] > [obj2 objectId]) return NSOrderedDescending;
            else if([obj1 objectId] < [obj2 objectId]) return NSOrderedAscending;
            else return NSOrderedSame;
    }];
    

    现在根据您的要求对它们进行排序

    NSMutableArray *finalArray = [NSMutableArray arrayWithArray:tempArray];
    
    NSInteger totalObjects = [tempArray count];
    NSInteger centerObjectIndex = totalObjects>>1;
    __block NSInteger rightPosition = centerObjectIndex + 1;
    __block NSInteger leftPosition = centerObjectIndex - 1;
    __block BOOL toggle = NO;
    
    
    
    [tempArray enumerateObjectsUsingBlock:^(id obj, NSUInteger idx, BOOL *stop) {
        if(idx == 0) [finalArray replaceObjectAtIndex:centerObjectIndex withObject:obj];
        else
        {
            if(toggle)
            {
                if(leftPosition >= 0)
                {
                    [finalArray replaceObjectAtIndex:leftPosition withObject:obj];
                    leftPosition -= 1;
                }
            }
            else
            {
                if(rightPosition < totalObjects)
                {
                    [finalArray replaceObjectAtIndex:rightPosition withObject:obj];
                    rightPosition += 1;
                }
            }
            toggle = !toggle;
        }
    }];
    

    如果数组包含偶数个对象,则最后一步是

    if(!(totalObjects % 2))
    {
        [finalArray removeObjectAtIndex:0];
        [finalArray addObject:[tempArray objectAtIndex:totalObjects-1]];
    }
    

    现在你到了终点。您的阵列名为 finalArray 根据您的要求进行排序。