找出NSArray / NSMutableArray会改变指数

时间:2013-06-26 09:33:14

标签: ios objective-c nsmutablearray nsarray

我有NSMutableArray oldArray。现在,在某个时刻,此NSMutableArray对象会使用另一个NSMutableArray进行更新,该NSMutableArray元素的元素数量可能会比之前的NSArray更多,更少或相同。

我想比较旧数组和新数组的变化。我想要的是两个addedArray s removedArrayoldArray = {@"a",@"b",@"d",@"e",@"g"}; newArray = {@"a",@"c",@"d",@"e",@"f",@"h"}; ,它们将包含已从旧数组中添加和/或删除的元素的索引。

通过一个例子,整个问题将更加明确:

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

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

因此,

removedArray

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

编辑1

如果我解释一下我想要使用它的话,也许会更清楚。

实际上我正在使用它的是在加载tableview后用方法removeRowsAtIndexPaths和{{1}}更新UITableView,以便用户可以看到删除的行熄灭和新行tableview存储用户可以添加或删除的收藏夹元素。添加一些收藏夹后删除一些;当用户返回收藏夹表格视图时,将显示动画。

编辑2

之前应该已经提到了这一点,但是旧数组和新数组中的元素都将按升序排列。只有删除或添加的指标才有意义。订单无法更改。恩。 {@“b”,@“a”,@“c”,@“d”} 不能是数组。

3 个答案:

答案 0 :(得分:5)

  

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

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

a b c d
b c d e

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

获得最小解决方案的一种方法是找到两个序列的Longest Common Subsequence (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

LCS中old以下的项目为1和4;不在LCS中的new项目分别为1,4和5。

这是另一个例子:

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

现在added3removed0

答案 1 :(得分:3)

  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"}
    
  3. 要查找数组的交叉点,您可以查看以下SO帖子: Finding Intersection of NSMutableArrays

答案 2 :(得分:1)

如果两个数组都已按升序排序,则可以找到添加和删除的数组 两个数组上都有单循环的元素(使用两个独立的指针进入数组):

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);

输出:

removed: (
    1,
    4
)
added: (
    1,
    4,
    5
)