通过评估邻居对象来过滤NSArray

时间:2014-01-24 16:24:02

标签: objective-c filter nsarray nspredicate

我遇到以下问题: 我有一个有序的NSArray对象,每个对象包含一个NSDate和一个NSNumber。 我想过滤数组,以便从具有相同值的连续对象中只有FIRST和LAST出现在filteredArray中。

示例:

13:01  7.0
13:02  7.1 (1st) 
13:03  7.1 (2nd, to be filtered)
13:04  7.1 (3rd)
13:05  7.2
13:06  7.2
13:07  7.3 (1st)
13:08  7.3 (2nd, to be filtered)
13:09  7.3 (3rd, to be filtered)
13:10  7.3 (4th)
13:11  7.1

我认为使用NSPredicate无法做到这一点,那么实现这一目标的最有效方法是什么?

感谢您的帮助!

3 个答案:

答案 0 :(得分:1)

由于它已经排序,如何简单地遍历数组,根据需要添加或替换对象?类似的东西:

NSMutableArray *myFilteredArray = [NSMutableArray arrayWithCapacity:myArray.count];
for (id object in myArray)
{
    if (myFilteredArray.count>1)
    {
        id secondLastObject = [myFilteredArray objectAtIndex:myFilteredArray.count-2];
        id lastObject = myFilterdArray.lastObject;
        if ([[secondLastObject number] isEqualToNumber:[object number] && [[lastObject number] isEqualToNumber:[object number]])
        {
            [myFilteredArray removeLastObject];
        }
    }
    [myFilteredArray addObject:object];
}

对我来说似乎应该非常有效,只有一个通过数组。

答案 1 :(得分:0)

我的做法是:

  1. 抛出数组并检查是否有三个相等的数字
  2. 如果有三个相同的数字,那么找出多少
  3. 删除除第一个和最后一个
  4. 之外的所有数字

    我不确定您是仅仅要求练习还是需要真实的代码,但如果您需要更多帮助,请告诉我。

答案 2 :(得分:0)

天真的方法:

NSMutableArray *arrayList = [NSMutableArray new];

// Split array
NSMutableArray *currentSubArray = nil;
float lastValue = 0.0f;
for (MyObject *obj in myArray) {
    if ((obj.value != lastValue) || !currentSubArray) {
        currentSubArray = [NSMutableArray new];
        [arrayList addObject:currentSubArray];
        lastValue = obj.value;
    }
    [currentSubArray addObject:obj];
}

// Join again with first/last objects only
NSMutableArray *myFilteredArray = [NSMutableArray new];
for (NSArray* subArray in arrayList) {
    [myFilteredArray addObject:[subArray firstObject]];
    if (subArray.count>1) {
        [myFilteredArray addObject:[subArray lastObject]];
    }
}