Сортировка массива в порядке возрастания без потери индекса Objective-C - PullRequest
2 голосов
/ 22 марта 2010

У меня есть массив, например,

    Array {
    3.0 at Index 0
    2.0 at Index 1
    3.5 at Index 2
    1.0 at Index 4
}

Я бы хотел отсортировать его в порядке возрастания без потери индекса в первую очередь, например,

    Array {
    1.0 at Index 4
    2.0 at Index 1
    3.0 at Index 0
    3.5 at Index 2
}

Когда я сортирую массив, используя это,

NSArray *sortedArray = [hArray sortedArrayUsingSelector:@selector(caseInsensitiveCompare:)];
[knnRecog sortUsingDescriptors:[NSArray arrayWithObject:sortAsc]];

Я теряю индекс.Кто-нибудь знает способ сохранить индекс после сортировки массива?Спасибо

Ответы [ 2 ]

2 голосов
/ 22 марта 2010

Вы можете выполнить необходимую сортировку, изменив основную структуру данных. Рассмотрите возможность использования массива массивов, например ::1001

{
    {3.0, Index 0},
    {2.0, Index 1},
    {3.5, Index 2},
    {1.0, Index 4}
}

и заданная функция сортировки:

NSComparisonResult customCompareFunction(NSArray* first, NSArray* second, void* context)
{
    id firstValue = [first objectAtIndex:0];
    id secondValue = [second objectAtIndex:0];
    return [firstValue compare:secondValue];
}

Вы можете отсортировать это так:

NSArray* myArray = [NSArray arrayWithObjects:
                    [NSArray arrayWithObjects:
                     [NSNumber numberWithFloat:3.0f],
                     [NSNumber numberWithInt:0], nil],
                    [NSArray arrayWithObjects:
                     [NSNumber numberWithFloat:2.0f],
                     [NSNumber numberWithInt:1], nil],
                    [NSArray arrayWithObjects:
                     [NSNumber numberWithFloat:3.5f],
                     [NSNumber numberWithInt:2], nil],
                    [NSArray arrayWithObjects:
                     [NSNumber numberWithFloat:1.0f],
                     [NSNumber numberWithInt:4], nil]];

NSArray* sortedArray = [myArray sortedArrayUsingFunction:customCompareFunction context:NULL];

NSLog(@"Sorted array: %@", sortedArray);

Какие отпечатки:

Сортированный массив: ( ( 1, 4 ), ( 2, 1 ), ( 3, 0 ), ( 3,5, 2 ) )

1 голос
/ 22 марта 2010

По определению, вы не можете сортировать массив и сохранять исходный индекс, потому что сортировка - это не что иное, как замена индексов для получения нового порядка сортировки. Сортировка всегда изменяет индексы.

Звучит так, как будто вы на самом деле хотите преобразовать индекс исходного массива в данные, а затем сохранить их в реальности вместе с данными исходного массива.

Если это так, то вам нужен массив словарей. Словарь должен связать один индекс исходного словаря со значением в этом индексе:

NSDictionary *anElement=[NSDictionary dictionaryWithObject:[intialArray objectAtIndex:i] forKey:[NSNumber numberWithInt:i]];

Затем добавьте каждый словарь в массив для их хранения. Затем вы можете отсортировать этот массив по своему усмотрению (используя предикат для словаря), не теряя отношения в исходном массиве.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...