0

有没有一种简单的方法可以将数字数组转换为按顺序排列数字的数组?

NSArray *numbers = @[@1,@2,@5,@3];

// Transformed arrays
//NSArray *numbersInSequence = @[@1,@2,@3];
//NSArray *numbersInSequence2 = @[@5];

编辑:

我修改了理查德答案中的代码以使其正常工作。

NSArray *arraysBySplittingNumbersInOrder(NSArray *input) {

// sort 'input'
input = [input sortedArrayUsingSelector:@selector(compare:)];

NSMutableArray *results = [NSMutableArray array];

if (input.count) {

    int start = 0;
    int last = INT_MIN;

    for (int i = 0; i < input.count; i++) {

        BOOL lastItem = i == input.count - 1;

        // The first item of the array
        if (i == 0) {

            if (lastItem) {
                [results addObject:input];
                break;
            }

            last = [input[i] intValue];
            continue;
        }

        int cur = [input[i] intValue];

        if (cur != last + 1) {

            // pull out the next array
            [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]];

            start = i;
        }

        // The last item of the array
        if (lastItem) {

            [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start + 1)]];            
        }

        last = cur;
    }
}

return results;
}
4

2 回答 2

0

我认为没有简单的方法可以做到这一点。您可能至少需要自己完成部分工作。

我的建议是对数组进行排序,然后对其进行迭代,边做边构建部分。每当您点击“跳跃”,即不连续的数字时,这会结束您当前的部分并开始新的部分。

于 2012-11-27T12:54:48.983 回答
0

这是一个相当简单的解决方案:

NSArray *arraysBySplittingNumbersInOrder(NSArray *input)
{
    // sort 'input'
    input = [input sortedArrayUsingSelector:@selector(compare:)];

    NSMutableArray *results = [NSMutableArray array];

    if (input.count)
    {
        int start = 0;
        int last = INT_MIN;

        for (int i = 0; i <= input.count; i++)
        {
            if (i == 0)
            {
                last = [input[i] intValue];
                continue;
            }
            if (i == input.count)
            {
                if (i != start + 1)
                {
                    [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]];
                    continue;
                }
            }

            int cur = [input[i] intValue];

            if (cur != last + 1)
            {
                // pull out the next array
                [results addObject:[input subarrayWithRange:NSMakeRange(start, i - start)]];
                start = i;
            }

            last = cur;
        }
    }

    return results;
}

int main()
{
    NSArray *input = @[ @1, @3, @4, @7, @8, @12, @13, @14 ];

    NSLog(@"%@", input);
    NSLog(@"%@", arraysBySplittingNumbersInOrder(input));
}

输出:

2012-11-27 07:55:04.609 TestProj[35890:303] (
    1、
    3、
    4、
    7、
    8、
    12,
    13,
    14
)
2012-11-27 07:55:04.611 TestProj[35890:303] (
        (
        1
    ),
        (
        3、
        4
    ),
        (
        7、
        8
    ),
        (
        12,
        13,
        14
    )
)
于 2012-11-27T12:56:31.963 回答