2014-01-24 31 views
0

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

例子:

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来完成,那么什么是实现这一目标的最有效方法是什么?

感谢您的帮助!

回答

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

似乎这样应该是相当有效的我,只有一个通过阵列。

+0

是的,一个天真的办法是划分阵列与相同的价值观子阵,并采取第一个和最后他们每个人的再次加入他们的行列。但这似乎不是非常高性能。 – akw

+0

是的,它应该是“if(myFilteredArray.count> 1)”。现在很好,谢谢!请删除你的答案的第一部分(最多“take two”) – akw

+0

我发现了一个小错误:不仅要比较倒数第二个元素的值,还要倒数第二个元素的值:if(([secondLastObject value] == [object value])&&([lastObject value] == [object value])){..} – akw

0

我的做法是:

  1. 去扔阵列并检查是否有三个相等的数字
  2. 如果有三个相等的数字,然后找出许多
  3. 如何删除所有数字,除了第一和最后

我不知道你是否只是要求实践或需要真正的代码,但让我知道如果你需要更多的帮助。

+0

是的,类似的东西,但它应该有可能做到这一点只有一个迭代未过滤数组的元素,也许通过保留最后两个元素的变量。 – akw

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