我一直在努力解决这个问题,但就是行不通。
我正在使用一些专有技术,一次只能移动一个元素。 super 烦人。将其视为 list.moveRow(before, after)。
想象一个包含 10 个项目的待办事项列表:1, 2, 3, 4, 5, 6, 7, 8, 9, 10
我想做的是重新排序其中的多个项目,
所以假设我选择了项目 2、6、7 和 8
。
然后我拖放到位置 4
。
想法是元素现在按顺序排列:1, 3, 2, 6, 7, 8, 4, 5, 9, 10
。
有没有简单的方法来做到这一点?我尝试使用额外的变量来跟踪由于元素移动而导致索引丢失的偏移量,但它非常困惑。 :(
最佳答案
这真的取决于语言。
假设您有一个简单的方法来为每个项目获取 isSelected(),最简单和最通用的似乎是构建一个新数组作为列表(即从第一个索引添加到最后一个索引):
- 按顺序添加未选中的项目,直到插入位置
- 添加所选项目
- 添加剩余未选中的项目
然后替换旧数组。
在伪代码中:
func(int[] items, bool[] isselected, int insertpos) {
newitems = new int[items.length]
i=0
for (j=0; j<items.length; j++) {
if j==insertpos {
for (k=0; k<items.length; k++) {
if isselected[k] {
newitems[i++] = items[k]
}
}
} else if !isselected[j] {
newitems[i++] = items[j]
}
}
return newitems
}
如果你想要高性能和就地修改......那是另一回事......
关于arrays - 将数组中的多个非相邻元素重新排序为特定索引的算法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11251720/