【问题标题】:Cocoa - Enumerate mutable array, removing objectsCocoa - 枚举可变数组,删除对象
【发布时间】:2010-03-27 17:42:48
【问题描述】:

我有一个可变数组,其中包含可变字典,其中包含键纬度、经度和 ID 的字符串。一些纬度和经度值是相同的,我想从数组中删除重复项,因此每个位置只有一个对象。

我可以枚举我的数组并使用第二次枚举查看每个对象以查找具有不同 id 但纬度和经度相同的对象,但如果我尝试删除该对象,我会在枚举期间使数组静音。

有没有办法在枚举时从数组中删除对象,所以我只在数组更新时枚举当前的对象集?

希望这个问题有意义。

谢谢, 豪伊

【问题讨论】:

    标签: cocoa nsmutablearray duplicates enumerate


    【解决方案1】:

    在枚举时计算一个索引变量。当您遇到有兴趣删除的字典时,请将其索引添加到 mutable index set。然后,当您完成枚举时,发送数组a removeObjectsAtIndexes: message,传递索引集。

    另一种方法是构建第二个数组,然后向第一个数组发送setArray: 消息,传递第二个数组——或者释放第一个,保留第二个,并将第二个设置为新的第一个。

    在不相关的注释中,您可以考虑将字典替换为 model objects。它倾向于使代码更简洁。

    【讨论】:

    • 感谢您的建议 - 我实际上尝试过类似的方法,但出现了问题。如果我在索引 3 上并且我发现它与索引 4 具有相同的位置,我会将索引 4 添加到“要删除”的数组中。当我循环进行下一次迭代时,我希望跳过索引 4 处的对象,因为我已经知道它是重复的。有没有办法在我枚举时或使用其他循环方法从原始数组中删除对象?
    • 沃德,彼得建议的两种方法都没有你描述的问题。不过,如果您想手动执行操作,有一种简单的方法可以避免这种情况:从最高索引到最低索引迭代要删除的对象。
    • Ward:不,您不能在枚举数组时对其进行变异。这将导致 Cocoa 异常。您必须在循环之后对其进行变异或替换它,或者在副本上循环。我推荐removeObjectsAtIndexes: 解决方案。
    【解决方案2】:

    其实你可以。您需要从顶部索引到 0。 试试这个:

    for (int i = [mutableArray count] -1; i >=0; i--) {
        id yourObject = [mutableArray objectAtIndex: i];
        BOOL needToDelete;
        // place you conditions here...
    
        if (needToDelete) {
            [mutableArray removeObject: yourObject];
        }
    }
    

    【讨论】:

    • 我可以使用 reverseObjectEnumerator 吗?
    • 是的,你可以。我刚刚用 reverseObjectEnumerator 对其进行了测试,它工作正常。
    猜你喜欢
    • 1970-01-01
    • 2011-08-20
    • 1970-01-01
    • 2017-08-23
    • 1970-01-01
    • 2016-08-25
    • 1970-01-01
    • 1970-01-01
    • 2023-04-04
    相关资源
    最近更新 更多