在 ArrayList 中四处移动项目

新手上路,请多包涵

我一直在玩 ArrayList s。我想要实现的是一种方法来做这样的事情:

 Item 1
Item 2
Item 3
Item 4

我正在尝试能够在列表中向上移动项目,除非它已经在顶部,在这种情况下它将保持不变。例如,如果第 3 项被移动,列表将是:

 Item 1
Item 3
Item 2
Item 4

从我目前的小理解来看,我想要的是:

 IF arrayname index is not equal to 0
THEN move up
ELSE do nothing

我正在努力的部分是“向上移动”部分。非常感谢有关如何实现这一目标的任何提示或代码示例。

原文由 user319940 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 404
2 个回答

我在寻找答案时遇到了这个老问题,我想我会发布我找到的解决方案,以防其他人经过这里寻找相同的解决方案。

对于交换 2 个元素,Collections.swap 很好。但是如果我们想移动更多元素,有一个更好的解决方案,涉及创造性地使用 Collections.sublist 和 Collections.rotate,直到我在这里看到它描述之前我没有想到:

http://docs.oracle.com/javase/6/docs/api/java/util/Collections.html#rotate%28java.util.List,%20int%29

这是引述,但你也可以去那里自己阅读整篇文章:

请注意,此方法可以有效地应用于子列表以在列表中移动一个或多个元素,同时保留其余元素的顺序。例如,以下习语将索引 j 处的元素向前移动到位置 k(必须大于或等于 j):

Collections.rotate(list.subList(j, k+1), -1);

原文由 Mikkel 发布,翻译遵循 CC BY-SA 3.0 许可协议

一个简单的交换对于在 ArrayList 中“向上移动一些东西”要好得多:

 if(i > 0) {
    Item toMove = arrayList.get(i);
    arrayList.set(i, arrayList.get(i-1));
    arrayList.set(i-1, toMove);
}

因为 ArrayList 使用数组,如果您从 ArrayList 中删除一个项目,它必须向上“移动”该项目之后的所有元素以填充数组中的空隙。如果您插入一个项目,它必须移动该项目之后的所有元素,以便为插入它腾出空间。如果您的阵列非常大,这些转变会变得非常昂贵。因为您知道您希望最终得到列表中相同数量的元素,所以进行这样的交换可以让您非常有效地将元素“移动”到列表中的另一个位置。

正如 Chris Buckler 和 Michal Kreuzman 指出的那样,Collections 类中甚至有一个方便的方法可以将这三行代码缩减为一行:

 Collections.swap(arrayList, i, i-1);

原文由 StriplingWarrior 发布,翻译遵循 CC BY-SA 2.5 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题