【发布时间】:2013-02-28 11:21:58
【问题描述】:
我试图在更新表格数据时仅应用最少数量的更改(这是一个 iOS 应用程序,表格视图当然是 UITableView,但我认为这与这里无关)。这些更改包括添加新项目、删除旧项目以及将一些现有项目移动到其他位置而不更新其内容。我知道关于 SO 也有类似的问题,但其中大多数只考虑添加和删除,现有问题要么被忽略,要么只是重新加载。
大多数移动涉及不超过几个现有元素,表格最多可包含 500 个元素。
数组中的项目是唯一的。
我可以通过从旧数组中的项集中减去新数组中的项集来轻松获得添加的项。而相反的操作会产生一组已删除的项目。
所以问题归结为找到具有相同元素的两个数组之间的最小差异。
[one, two, three, four]
[one, three, four, two]
区分这些数组应该只是从索引 1 移动到 3。
算法不知道是否只有一个这样的动作。改变也可以是:
[one, two, three, four, five]
[one, four, five, three, two]
这应该导致将索引 1 移动到 4 和 2 到 3,而不是将 3 和 4 向左移动两个索引,因为这可能会导致移动 300 个项目,而实际上更改应该要简单得多。 就将视觉变化应用到视图而言。 这可能需要重新计算单元格高度或执行大量动画和其他相关操作。我想避开他们。举个例子 - 将一个项目标记为收藏,这会导致将该项目移动到列表顶部或 300 个项目大约需要 400 毫秒。那是因为使用我目前使用的算法,例如100 个项目向上移动一个索引,一个移动到索引 0,其他 199 个保持不变。如果我取消标记它,一个项目会向下移动 100 个索引,这很好,但这是完美的,但非常罕见的情况。
我尝试在旧数组中查找项目的索引,检查它是否在新数组中更改。如果有变化,我将项目从新索引移动到旧索引,记录相反的变化并比较数组,直到元素顺序相等。但这有时会导致移动实际上未更改的大量项目,具体取决于这些项目的位置。
所以问题是:我能做什么?
有什么想法或建议吗?也许是修改后的 Levenshtein 距离算法?未修改的可以为此工作吗?如果是这样,我可能不得不以一种或另一种形式实现它。
橡皮鸭说话:
考虑找到所有未更改的项目序列并移动所有其他项目。会不会是正确的方向?
【问题讨论】:
-
this might help(特别是公认的答案:找到循环并交换)。
-
我还不明白。在您的第一个示例中,从概念上讲,它是从索引 1 到 3 的移动。但是,实际上,如果您更新表,则需要触及所有内存位置 1、2 和 3。我错过了什么?
-
其实不是关于内存位置1、2、3的问题,更多的是在table view的单元格中应用最小数量的变化,因为修改的越少,view的操作就越少必须执行才能顺利更新。如果我移动或重新加载 299 个项目,而不是碰巧从头到尾移动的项目,则表视图将不得不调用例如299 个单元格高度重新计算或有效地 299 个单独的对象动画,而不仅仅是一个。为了清楚起见,编辑了问题。
-
@macbirdie 我链接的答案没有帮助吗?
-
我会在晚上查看链接,assylias。谢谢!整个问题不是很紧急,我对我当前的算法进行了一些更正,因此它运行得更快并且没有错误,但会在这个过程中找到更好的解决方案。