找出NSArray / NSMutableArray更改的索引

我有一个NSMutableArray oldArray 。 现在,在某一点上,这个NSMutableArray对象被另一个NSMutableArray更新,它可能会有更多,更less或相同数量的元素作为以前的NSMutableArray

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

举个例子来说,这个问题会更加清楚:

 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获取加载后,使用animation方法insertRowsAtIndexPathsremoveRowsAtIndexPaths来更新UITableView,以便用户可以看到被删除的行出去,并且新的行进入。表视图存储的collections夹元素用户可以添加或删除。 所以在添加一些collections夹并删除一些后, 当用户回到collections夹桌面时,会显示animation。

编辑2

早些时候应该提到这一点,但是旧的和新的arrays中的元素将会以升序排列。 只有删除或添加事项的指标。 订单不能更改。 恩。 {@“b”,@“a”,@“c”,@“d”}不能是数组。

我试过使用循环迭代旧的和新的数组,如果条件,但它变得非常混乱和越野车。

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

 abcd bcde 

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

获得最小解决scheme的一种方法是find两个序列的最长公共子序列(LCS) 。 findLCS的algorithm会告诉你两个序列的哪些元素属于LCS,哪些不属于LCS。 原始数组中不在LCS中的每个元素的索引都进入了removed数组; 不在LCS中的新arrays的元素的索引进入addedarrays。

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

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

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

这是另一个例子:

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

现在added 3removed 0

  1. addedArray = newArray∖(newArray∩oldArray)

      = newArray ∖ ({@"a",@"c",@"d",@"e",@"f",@"h"} ∩ {@"a",@"b",@"d",@"e",@"g"}) = newArray ∖ {@"a",@"d",@"e"} = {@"a",@"c",@"d",@"e",@"f",@"h"} ∖ {@"a",@"d",@"e"} = {@"c",@"f",@"h"} 
  2. removedArray = oldArray∖(oldArray∩newArray)

      = oldArray ∖ ({@"a",@"b",@"d",@"e",@"g"} ∩ {@"a",@"c",@"d",@"e",@"f",@"h"}) = oldArray ∖ {@"a",@"d",@"e"} = {@"a",@"b",@"d",@"e",@"g"} ∖ {@"a",@"d",@"e"} = {@"b",@"g"} 

要查找数组的交集,可以查看以下SOpost: 查找NSMutableArrays的交集

如果两个数组已经按升序sorting,则可以在两个数组上使用单个循环来查找添加和删除的元素(在数组中使用两个独立的指针):

 NSArray *oldArray = @[@"a",@"b",@"d",@"e",@"g"]; NSArray *newArray = @[@"a",@"c",@"d",@"e",@"f",@"h"]; NSMutableArray *removedArray = [NSMutableArray array]; NSMutableArray *addedArray = [NSMutableArray array]; NSUInteger iold = 0; // index into oldArray NSUInteger inew = 0; // index into newArray while (iold < [oldArray count] && inew < [newArray count]) { // Compare "current" element of old and new array: NSComparisonResult c = [oldArray[iold] compare:newArray[inew]]; if (c == NSOrderedAscending) { // oldArray[iold] has been removed [removedArray addObject:@(iold)]; iold++; } else if (c == NSOrderedDescending) { // newArray[inew] has been added [addedArray addObject:@(inew)]; inew++; } else { // oldArray[iold] == newArray[inew] iold++, inew++; } } // Process remaining elements of old array: while (iold < [oldArray count]) { [removedArray addObject:@(iold)]; iold++; } // Process remaining elements of new array: while (inew < [newArray count]) { [addedArray addObject:@(inew)]; inew++; } NSLog(@"removed: %@", removedArray); NSLog(@"added: %@", addedArray); 

输出:

删除:(
     1,
     4
 )
添加: (
     1,
     4,
    五
 )