2013-02-22 3 views
2

У меня есть массив, который я уже установил в качестве 5. Что я хочу сделать, когда я добавляю объект и емкость превышает 5, тогда он перемещает всю структуру массива объектов одним. Например, 1,2,3,4,5 (массив). Затем, когда добавляется 6, он должен заменить 5 и удалить один, чтобы получить 2,3,4,5,6 и т. Д. Таким образом, другими словами, он должен сохранять только последние 5 объектов. НО, как и в реальном кодировании, он сохраняет объекты с координатами в массиве емкостью 100+, поэтому он должен быть быстрым и эффективным. Я попытался с междунар, чтобы увидеть, как она прогрессирует:Заменить, переместить объекты в NSMutableArray

 NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5]; 

      int i; 
      for (i = 0; i<=20;i++) { 
       NSNumber *number = [NSNumber numberWithInt:i]; 
       if (i>=5) { 
       [array insertObject:number atIndex:5]; 
       }else{ 
       [array addObject:number]; 
       } 
       NSLog(@"array = %@, count = %i",array, array.count); 
      } 

, но он хранит все 20 сортировкой как 1,2,3,4,20,19,18,17 ... 6 любая помощь будет оценена ! Заранее спасибо ..

+0

Могу ли я дать свой собственный код для выполнения этой задачи? –

+0

уверен ... спасибо! – user1780591

+0

Спасибо! Извините, но у меня нет репутации, чтобы поддержать вас .. Спасибо! – user1780591

ответ

0

Если индекс уже занят, объекты по индексу и далее сдвигаются, добавляя 1 к их индексам, чтобы освободить место. , так что вы можете использовать replaceObjectAtIndex:withObject: это заменит объект. но если вы хотите удалить первый объект, вы сделаете это сами. сначала проверьте длину массива. если больше 5, удалите первый элемент и переместите все объекты в нижний индекс. затем добавьте новый объект.

if ([array count]>=5) 
{ 
[array removeObjectAtIndex:index]; 

[array insertObject:new object atIndex :5]; 
1

Создать метод добавления значения в массив как этот .Это будет удалить первый объект, если он превышает 5 зва добавить последний объект .Problem решило

-(void)addObjectToArray:(id)lastObj 
{ 
    [array addObject:lastObj]; 
    if ([array count]>5) { 
     [array removeObjectAtIndex:0]; 
    } 
} 

счастливым кодирования.

+0

Спасибо .. К сожалению, у меня нет репутации, чтобы поддержать все ответы, поэтому я буду всем вам благодарен :) – user1780591

3

Вы можете сделать это так:

Даже вы можете поставить AddTo: withValueLast: как категория:

-(NSMutableArray *)addTo:(NSMutableArray *)array withLastValue:(NSNumber *)number{ 
    if (array.count<5) { 
     [array addObject:number]; 
    } 
    else{ 
     [array removeObjectAtIndex:0]; 
     [array addObject:number]; 
    } 
    return array; } 

- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { 
    NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5]; 

    for (int i=0; i<=20; i++) { 
     NSNumber *number = [NSNumber numberWithInt:i]; 
     [self addTo:array withLastValue:number]; 
     NSLog(@"array = %@, count = %ld",array, array.count); 
    } 
} 

Используя Категория:

.h файл :

@interface NSMutableArray (Slide) 
-(NSMutableArray *)slideWithValue:(NSNumber *)number; 
@end 

.m файл:

#import "NSMutableArray+Slide.h" 

@implementation NSMutableArray (Slide) 

-(NSMutableArray *)slideWithValue:(NSNumber *)number{ 
    if (self.count<5) { 
     [self addObject:number]; 
    } 
    else{ 
     [self removeObjectAtIndex:0]; 
     [self addObject:number]; 
    } 
    return self; 
} 
@end 

Теперь ваш код идет как:

NSMutableArray *array = [[NSMutableArray alloc] initWithCapacity:5]; 
for (int i=0; i<=20; i++) { 
    NSNumber *number = [NSNumber numberWithInt:i]; 
    [array slideWithValue:number]; 

    NSLog(@"array = %@, count = %ld",array, array.count); 
} 
+0

Я не тестировал это, но я исправил его, просто добавив [array removeObjectAtIndex: 0] сразу после добавления новый объект и, кажется, автоматически переводит все объекты на один. Спасибо вам за подробный ответ. я ценю это – user1780591