我有一个 NSMutableArray
oldArray
。现在,在某一时刻,这个 NSMutableArray
对象被另一个 NSMutableArray
更新,它可能有更多、更少或相同数量的元素作为前一个 NSMutableArray
.
我想比较新旧数组的变化。我想要的是两个 NSArray
s addedArray
和 removedArray
,它们将包含已添加和/或从旧元素中删除的元素的索引大批。
举个例子,整个问题会更清楚:
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
中获取这两个数组 - removedArray
和 addedArray
。谢谢!如果问题不是很容易理解,我愿意提供更多信息。
编辑 1
如果我解释一下我想用它做什么,也许会更清楚。
实际上,我使用它的目的是在加载 tableview 后使用动画方法 insertRowsAtIndexPaths
和 removeRowsAtIndexPaths
更新 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
现在 added
是 3
而 removed
是 0
。
关于ios - 找出 NSArray/NSMutableArray 变化的索引,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17316438/