2

我有一个数组,我已经将容量设置为 5。我想要做的是,当我添加一个对象并且容量超过 5 时,它会将对象的整个数组结构移动一个。例如 1,2,3,4,5(数组)。然后当添加 6 时,它必须替换 5 并删除 1 以产生 2、3、4、5、6 等等。所以换句话说,它只需要保存最后 5 个对象。但与实际编码一样,它将坐标对象保存在容量为 100+ 的数组中,因此它必须快速高效。我尝试使用 int 来查看它的进展情况:

      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 任何帮助将不胜感激!先感谢您..

4

3 回答 3

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);
}
于 2013-02-22T07:12:42.813 回答
1

像这样创建向数组添加值的方法。当它超过 5 时它将删除第一个对象并添加最后一个对象。

-(void)addObjectToArray:(id)lastObj
{
   [array addObject:lastObj];
    if ([array count]>5) {
        [array removeObjectAtIndex:0];
    }
}
于 2013-02-22T07:12:28.377 回答
0

如果 index 已被占用,则 index 处及之后的对象会通过将其索引加 1 来移动以腾出空间。所以你可以使用的是replaceObjectAtIndex:withObject:这将替换对象。但是如果你想删除第一个对象,你可以自己做。首先检查数组的长度。如果大于 5,则删除第一个元素并将所有对象移动到较低的索引。然后添加新对象。

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

[array insertObject:new object atIndex :5];
于 2013-02-22T07:12:28.673 回答