0

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

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

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

//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]; 
     } 
    } 
} 

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

Update -

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

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

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

+0

Что произойдет, если ваш sortedArray содержит, скажем, 3 органических элемента, но первый признанный элемент был в первом индексе 2? В этом случае отсортированный массив уже имеет объект с индексом 2, когда вы пытаетесь добавить элемент с атрибутом по старому индексу – LoVo

+0

. Рассмотрим, что сначала есть 2 элемента, 5 органических в середине и 1 признанный & 1 заявленный наконец. Затем sortedArray после сортировки получает 5 органических. После последнего цикла я получаю только 7 (2featured + 5organic). для выключения цикла после добавления первых двух элементов, потому что sortedArray.count Vin

ответ

1

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

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]; 

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

+0

Отлично !!! Благодарю. Работает на меня. – Vin

0

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

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

Последовательность не должна изменяться. Существует такая структура, как [{feat1 feat2}, {org1, org2 ..}, {calimed1}, {feat11, feat12}, {organic11, org12 ..}, {alleged2}, ..] – Vin

0

Вы можете взять первые 2 функции. Остальные - это то, что я использовал для тестирования.

- (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 

 Смежные вопросы

  • Нет связанных вопросов^_^