如何将数组列表中的特定项目移动到第一个项目

use*_*104 53 java collections android swap arraylist

例如:一个列表

ABCDE

给定C,切换到

CABDE

请注意,数组大小将更改,某些项可能会在运行时删除

Collections.swap(url, url.indexOf(itemToMove), 0);
Run Code Online (Sandbox Code Playgroud)

这句话不起作用,因为它输出的是CBADE而不是CABDE,如何修复呢?

谢谢.

Chr*_*yes 84

你想要的是一个非常昂贵的操作ArrayList.它需要在列表的开头和C向下的位置之间移动每个元素.

但是,如果你真的想这样做:

int index = url.indexOf(itemToMove);
url.remove(index);
url.add(0, itemToMove);
Run Code Online (Sandbox Code Playgroud)

如果这是您的常用操作,并且随机访问的频率较低,您可以考虑切换到另一个List实现,例如LinkedList.如果您对元素的顺序如此关注,您还应该考虑列表是否是正确的数据结构.

  • 如果速度是一个标准,那么也许你也应该看看http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html (3认同)

Ven*_*hna 15

做这个:

  1. 从列表中删除元素:ArraylistObj.remove(object);
  2. 将元素添加特定位置的列表:ArrayListObj.add(position, Object);

根据您的代码使用此:

url.remove("C");
url.add(0,"C");
Run Code Online (Sandbox Code Playgroud)


hbs*_*rud 5

问题是,您将C与A交换,因此ABCDE变成CBADE。

您可以尝试这样的事情:

url.remove(itemToMove);
url.add(0, itemToMove);
Run Code Online (Sandbox Code Playgroud)

或者如果urlLinkedList

url.remove(itemToMove);
url.addFirst(itemToMove);
Run Code Online (Sandbox Code Playgroud)


MYL*_*YLS 5

另一种解决方案,只需保持从交换0indexOf(itemToMove)

这是我的Kotlin版本:

val list = mutableListOf('A', 'B', 'C', 'D', 'E')
(0..list.indexOf('C')).forEach {
    Collections.swap(list, 0, it)
}
Run Code Online (Sandbox Code Playgroud)

抱歉,我不熟悉Java,但是学到了一些Kotlin。但是算法是一样的。