ios - 找出 NSArray/NSMutableArray 变化的索引

标签 ios objective-c nsmutablearray nsarray

我有一个 NSMutableArray oldArray。现在,在某一时刻,这个 NSMutableArray 对象被另一个 NSMutableArray 更新,它可能有更多、更少或相同数量的元素作为前一个 NSMutableArray.

我想比较新旧数组的变化。我想要的是两个 NSArrays addedArrayremovedArray ,它们将包含已添加和/或从旧元素中删除的元素的索引大批。

举个例子,整个问题会更清楚:

oldArray = {@"a",@"b",@"d",@"e",@"g"};

newArray = {@"a",@"c",@"d",@"e",@"f",@"h"};

因此,这里删除的对象分别是索引 1 和 4 处的 @"b"和 @"g"。添加的对象是索引 1、4 和 5 处的 @"c"、@"f"和 @"h"(首先删除对象,然后添加)。

因此,

removedArray = {1,4};  and  addedArray = {1,4,5};

我想要一种有效的方法来从旧的和新的 NSMutableArray 中获取这两个数组 - removedArrayaddedArray。谢谢!如果问题不是很容易理解,我愿意提供更多信息。

编辑 1

如果我解释一下我想用它做什么,也许会更清楚。

实际上,我使用它的目的是在加载 tableview 后使用动画方法 insertRowsAtIndexPathsremoveRowsAtIndexPaths 更新 UITableView,以便用户可以看到删除的行出去,新行进来。 tableview 存储用户可以添加或删除的收藏夹元素。所以在添加了一些收藏夹并删除了一些之后;当用户返回到收藏夹 TableView 时,将显示动画。

编辑 2

早该提到这一点,但是旧数组和新数组中的元素都会按升序排列。只有删除或添加的索引很重要。订单不能更改。前任。 {@"b",@"a",@"c",@"d"} 不能是数组。

最佳答案

I have tried iterating through the old and the new arrays using loops and if conditions, but is it getting really messy and buggy.

这不是一个简单的问题。首先,请注意它可能有多种解决方案:

a b c d
b c d e

(a={0, 1, 2, 3}, r={0, 1, 2, 3})(a={3}, r={ 0}) 是有效的解决方案。您可能正在寻找的是一个最小解决方案。

获得最小解的一种方法是找到 Longest Common Subsequence (LCS)的两个序列。查找 LCS 的算法会告诉您两个序列中哪些元素属于 LCS,哪些不属于。不在 LCS 中的原始数组的每个元素的索引进入 removed 数组;不在 LCS 中的新数组元素的索引进入 added 数组。

这里有几个例子(我把LCS的元素用括号括起来了):

 0  1   2   3   4   5
(a) b  (d) (e)  g
(a) c  (d) (e)  f   h

不在LCS中的old项目是1和4;不在 LCS 中的 new 项目是 1、4 和 5。

这是另一个例子:

 0   1   2   3
 a  (b) (c) (d)
(b) (c) (d)  e

现在 added3removed0

关于ios - 找出 NSArray/NSMutableArray 变化的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316438/

相关文章:

objective-c - NSUserDefaults 与 sqlite3

objective-c - 我如何从 objective-c 代码中获取 Swift AppDelegate 的引用

Objective-C:复制数组,仅在复制中修改元素(对象)

iphone - exc_bad_access 来自实例中的 nsstring - 困难,但很酷

ios - iOS 8 上的可达性延迟?

ios - 对多个变量使用 arc4random

ios - 使用 cocoapods for firebase 的 React-native 共享扩展问题

ios - Xcode 6 测试版 3 : Simulator Issue

iphone - 无法创建持久存储协调器

ios - 从 NSMutableArray 对象属性中删除重复对象?