本文介绍一种基于邻接关系对比的高效方法,通过分析元素在新旧数组中前后邻居的变化,精准定位被拖动并改变位置的单个元素,适用于拖拽排序场景。
在实现可拖拽排序的 UI(如列表、看板等)时,一个常见需求是:仅通过对比拖拽前后的数组,识别出“哪个元素被主动拖动”。注意,这里并非检测所有差异(如增删),而是聚焦于单次拖动导致的位移——即数组长度不变、元素集合相同,仅顺序发生改变。
核心思路是:一个被拖动的元素,其在新旧数组中的直接邻居(前驱与后继)通常都会发生变化;而未被移动的元素,至少有一个邻居保持不变(尤其是当移动距离 ≥ 2 时)。例如,将 id5 从索引 4 移至索引 2:
- 原位置邻居:id4(前)、id6(后)
- 新位置邻居:id2(前)、id3(后)
→ 两个邻居全变 → 高概率为被拖动项。
而像 id3 这类被动“让位”的元素,其原邻居是 id2/id4,新邻居变为 id5/id4 —— 后继 id4 未变,因此不满足“双邻居均变更”的条件。
以下是可直接运行的健壮实现: