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

Среди них я хочу отсортировать только органические элементы и сохранить избранные и заявленные элементы в их собственном индексе.

Код работает хорошо. За исключением заявленных / (и) избранных элементов в последнем индексе «массива». Поскольку в этом сценарии индекс sortedArray остается меньше, чем array.count. Заранее спасибо.

//Initialization
NSMutableArray *sortedArray = nil;
NSMutableDictionary *tempFeaturedDictionary = [[NSMutableDictionary alloc]init];
NSMutableDictionary *tempClaimedDictionary = [[NSMutableDictionary alloc]init];
NSMutableArray *tempOrganicArray = [[NSMutableArray alloc]init];

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

    DRListing *isFeaturedObj = (DRListing*)[array objectAtIndex:i];

    if (isFeaturedObj.featured) {
        [tempFeaturedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
    }else if (isFeaturedObj.claimed)
    {
        [tempClaimedDictionary setObject:isFeaturedObj forKey:[@(i)stringValue]];
    }else
        [tempOrganicArray addObject:isFeaturedObj];

}

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

 sortedArray = [NSMutableArray arrayWithArray:[tempOrganicArray sortedArrayUsingDescriptors:sortDescriptorsArray]];

for (int i = 0; i<sortedArray.count; i++) {
    for (NSString *key in tempFeaturedDictionary) {
        if ( [[@(i)stringValue] isEqualToString: key] ) {
            [sortedArray insertObject:[tempFeaturedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
        }}

    for (NSString *key in tempClaimedDictionary) {
        if ([[@(i)stringValue]isEqualToString:key ]) {
            [sortedArray insertObject:[tempClaimedDictionary objectForKey:[@(i)stringValue]] atIndex:i];
        }
    }
}

И мне разрешено сортировать только органические элементы в этом массиве. Показанные и заявленные объявления не должны терять свою исходную позицию в индексе.

Обновление -

Я получаю массив ответов типа:

[{featured1 featured2}, {organic1, organic2..}, {claimed1}, {featured11, featured12}, {organic11, organic12..}, {claimed2}, ..]

Это ошибка в Android Studio, я заметил ее в сборке {{X0}}, иногда она не обновлялась, поэтому я перестраиваю весь проект, еще одна вещь, если у вас включен {{X1}} и ваше устройство не работает {{X2}} он не будет работать, убедитесь, что он отключен, и пересоберите свой проект.

0
Vin 13 Май 2016 в 13:18

3 ответа

Лучший ответ

Но если ваш массив не особенно велик, повышение производительности, вероятно, будет незначительным.

NSMutableArray *organicsArray = [NSMutableArray new];

for (int i = 0; i < array.count; i++) {
    DRListing *isFeaturedObj = (DRListing*)array[i];

    if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
        [organicsArray addObject:isFeaturedObj];
    }
} 
NSMutableArray *sortedOrganicsArray = [[organicsArray sortedArrayUsingDescriptors:sortDescriptorsArray] mutableCopy];

NSMutableArray *outputArray = [NSMutableArray new];

for (int i = 0; i < array.count; i++) {
    DRListing *isFeaturedObj = (DRListing*)array[i];

    if ((!isFeaturedObj.featured) && (!isFeaturedObj.claimed)) {
        [outputArray addObject:sortedOrganicsArray[0]];
        [sortedOrganicsArray removeObjectAtIndex:0];
    } else {
        [outputArray addObject:isFeaturedObject];
    }
}

Вы могли бы сделать его немного более эффективным, если бы изменили порядок сортировки для массива органических веществ, с тех пор вы могли бы сказать

[outputArray addObject:[sortedOrganicsArray lastObject]];
[sortedOrganicsArray removeLastObject];

Я сортирую массив. В массиве есть три типа элементов. 1. рекомендуемые 2. органические и 3. востребованные.

1
Paulw11 13 Май 2016 в 11:16

Может быть, это альтернатива:

NSMutableArray *organics = [NSMutableArray new];
NSMutableArray *others = [NSMutableArray new];

for (DRListing *isFeaturedObj in array) {
     if (isFeaturedObj.organic) {
         [organics addObject:isFeaturedObj];
     } else {
         [others addObject:isFeaturedObj];
     }
 }

 NSMutableArray *sorted = [NSMutableArray alloc]initWithObjects:organics,others, nil];
0
LoVo 13 Май 2016 в 10:55

Я бы перебирал массив, извлекая органические элементы для сортировки. Затем отсортируйте свой органический массив. Затем выполните итерацию по исходному массиву, беря либо элемент из исходного массива, либо элемент из отсортированного массива органических веществ, в зависимости от ситуации.

- (DRListing *)getNextObjectFromArray:(NSArray *)array WithStartingIndex:(int)index
{
    for (int i=index; i<array.count; i++) {
        DRListing *obj = (DRListing*)[array objectAtIndex:i];
        if (!obj.featured && !obj.claimed)
        {
            return obj;
        }
    }

    return nil;
}

- (void)sortArray:(NSMutableArray *)array
{
    for (int pass = 0; pass<array.count-1; pass++) {
        for (int i=0; i<array.count-1; i++) {
            DRListing *obj = [self getNextObjectFromArray:array WithStartingIndex:i];
            int foundIndex = (int)[array indexOfObject:obj];
            DRListing *obj2 = [self getNextObjectFromArray:array WithStartingIndex:foundIndex+1];
            int foundIndex2 = (int)[array indexOfObject:obj2];

            if (obj!=nil && obj2 !=nil) {
                if (obj.value >= obj2.value) {
                    [array exchangeObjectAtIndex:foundIndex withObjectAtIndex:foundIndex2];
                }

                i = foundIndex;
            }
        }
    }

    NSLog(@"Sorted Data: %@",array);
}

- (NSMutableArray *)testData
{
    NSMutableArray *array = [NSMutableArray new];
    for (int i=0; i<20; i++) {
        DRListing *obj = [DRListing new];
        obj.featured = i*i%2;
        obj.claimed = i%2;
        obj.value = i*3%10;
        [array addObject:obj];
    }

    NSLog(@"Test Data: %@",array);
    return array;
}

@interface DRListing : NSObject

@property (nonatomic) BOOL featured;
@property (nonatomic) BOOL claimed;
@property (nonatomic) int value;
@end
0
Murat Tezyapar 13 Май 2016 в 11:22