找出NSArray/NSMutableArray会改变指数

aks*_*h1t 7 objective-c nsmutablearray nsarray ios

我有一个NSMutableArray oldArray.现在,在某一点上,这个NSMutableArray对象会被另一个对象更新,这个对象NSMutableArray可能具有比前一个更多,更少或相同数量的元素NSMutableArray.

我想比较旧数组和新数组的变化.我想有两个NSArray小号addedArrayremovedArray其中将包含已添加和/或删除旧的数组中的元素的索引.

通过一个例子,整个问题将更加清晰:

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

newArray = {@"a",@"c",@"d",@"e",@"f",@"h"};
Run Code Online (Sandbox Code Playgroud)

因此,这里删除的对象分别是索引1和4处的@"b"和@"g".并且在索引1,4和5处添加的对象是@"c",@"f"和@"h"(删除第一个对象,然后添加).

因此,

removedArray = {1,4};  and  addedArray = {1,4,5};
Run Code Online (Sandbox Code Playgroud)

我想要一种有效的方法来获得这两个数组 - removedArray以及addedArray来自旧的和新的NSMutableArray.谢谢!如果问题不是很容易理解,我愿意提供更多信息.

编辑1

如果我解释一下我想要用什么,也许会更清楚.

实际上我正在使用的是在加载tableview之后使用方法insertRowsAtIndexPathsremoveRowsAtIndexPaths动画更新UITableView ,以便用户可以看到删除的行熄灭并且新行进入.tableview存储用户可以使用的收藏夹元素添加或删除.添加一些收藏夹后删除一些; 当用户返回收藏夹表视图时,将显示动画.

编辑2

本来应该提到过这个,但是旧数组和新数组中的元素都是按升序排列的.只有删除或添加的指标才有意义.订单无法更改.恩.{@"b",@"a",@"c",@"d"}不能是数组.

das*_*ght 5

我已经尝试使用循环和条件迭代旧的和新的数组,但它是否变得非常混乱和错误.

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

a b c d
b c d e
Run Code Online (Sandbox Code Playgroud)

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

获得最小解决方案的一种方法是找到两个序列的最长公共子序列(LCS).用于查找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
Run Code Online (Sandbox Code Playgroud)

old不在LCS中的项目是1和4; new不在LCS中的项目是1,4和5.

这是另一个例子:

 0   1   2   3
 a  (b) (c) (d)
(b) (c) (d)  e
Run Code Online (Sandbox Code Playgroud)

现在added3removed0.