【问题标题】:Filter NSArray by evaluating neighbor objects通过评估邻居对象过滤 NSArray
【发布时间】:2014-01-24 16:24:01
【问题描述】:

我遇到了以下问题: 我有一个有序的 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 来完成,那么最有效的方法是什么?

感谢您的帮助!

【问题讨论】:

    标签: objective-c filter nsarray 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];
    }
    

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

    【讨论】:

    • 是的,一种天真的方法是将数组划分为具有相同值的子数组,然后通过获取每个子数组的第一个和最后一个来再次连接它们。但这似乎不是很高效..
    • 是的,应该是“if (myFilteredArray.count>1)”。现在真的很好,谢谢!请删除答案的第一部分(最多“取两个”)
    • 我发现了一个小错误:不仅要比较倒数第二个元素的值,还要比较最后一个元素的值: if (([secondLastObject value] == [object value]) && ([lastObject value] == [对象值])) { .. }
    • 将其添加到答案中,一定是被数字总是增加的一般模式所抛弃,并假设我只需要检查倒数第二个。
    • 另一个小优化:可以使用“id tempObject;”并摆脱对数组的不必要的添加和删除。不是删除,而是将 tempObject 设置为 nil,而不是“addObject:object”,让我们说: if (tempObject) {[myFilteredArray addObject: tempObject];}; tempObject = 对象;
    【解决方案2】:

    我的做法是:

    1. 去扔数组,看看有没有三个相等的数
    2. 如果有三个相等的数,那么找出有多少
    3. 删除除第一个和最后一个以外的所有数字

    我不确定您是否只是要求练习或需要真正的代码,但如果您需要更多帮助,请告诉我。

    【讨论】:

    • 是的,类似这样,但应该可以通过只对未过滤数组的元素进行一次迭代来做到这一点,也许通过将最后两个元素保留在变量中。
    【解决方案3】:

    天真的方法:

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

    【讨论】:

      猜你喜欢
      • 2011-12-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多