我有NSMutableArray
oldArray
。现在,在某个时刻,此NSMutableArray
对象会使用另一个NSMutableArray
进行更新,该NSMutableArray
元素的元素数量可能会比之前的NSArray
更多,更少或相同。
我想比较旧数组和新数组的变化。我想要的是两个addedArray
s removedArray
和oldArray = {@"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
中获取这两个数组 - NSMutableArray
和insertRowsAtIndexPaths
。谢谢!如果问题不是很容易理解,我愿意提供更多信息。
编辑1
如果我解释一下我想要使用它的话,也许会更清楚。
实际上我正在使用它的是在加载tableview后用方法removeRowsAtIndexPaths
和{{1}}更新UITableView,以便用户可以看到删除的行熄灭和新行tableview存储用户可以添加或删除的收藏夹元素。添加一些收藏夹后删除一些;当用户返回收藏夹表格视图时,将显示动画。
编辑2
之前应该已经提到了这一点,但是旧数组和新数组中的元素都将按升序排列。只有删除或添加的指标才有意义。订单无法更改。恩。 {@“b”,@“a”,@“c”,@“d”} 不能是数组。
答案 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
现在added
为3
,removed
为0
。
答案 1 :(得分:3)
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"}
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"}
要查找数组的交叉点,您可以查看以下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 )