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

94

例如:一个列表

A B C D E

给定C,切换到

C A B D E

请注意,数组大小将会改变,一些元素可能会在运行时被删除。

Collections.swap(url, url.indexOf(itemToMove), 0);

这个语句无法正常工作,因为它输出的是 C B A D E 而不是 C A B D E,如何修复?

谢谢。

8个回答

134

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

然而,如果你真的想要这样做:

int index = url.indexOf(itemToMove);
url.remove(index);
url.add(0, itemToMove);

如果这对你来说是一个频繁的操作,而随机访问则不那么频繁,你可能考虑切换到另一个List实现,如LinkedList。 如果你非常关心元素的顺序,你还应该考虑是否列表是正确的数据结构。


4
如果速度是一个标准,那么也许你应该看一下http://commons.apache.org/proper/commons-collections/javadocs/api-3.2.1/org/apache/commons/collections/list/TreeList.html。 - Aditya
@Aditya,链接已经失效了。 - AJW
这是新链接 - https://commons.apache.org/proper/commons-collections/javadocs/api-4.4/org/apache/commons/collections4/list/TreeList.html - Aditya

22

请执行以下操作:

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

根据您的代码,请使用此方法:

url.remove("C");
url.add(0,"C");

1
这不会增加列表的大小吗? - Pankaj Kumar
然后通过使用url.remove("C")从列表中删除元素,并通过使用url.add(0,"C")在零位置添加元素。 - Venkata Krishna

14
另一个解决方案是,不断将元素从 0indexOf(itemToMove) 进行交换。
这是我的 Kotlin 版本:
val list = mutableListOf('A', 'B', 'C', 'D', 'E')
(0..list.indexOf('C')).forEach {
    Collections.swap(list, 0, it)
}

对不起,我对Java不熟悉,但我学了一点Kotlin。但算法是相同的。


输出结果是"C, B, A, D, E",而不是"C, A, B, D, E"。 - lazarevzubov
@lazarevzubov 你可以在 Kotlin Playground 上测试它,例如 https://pl.kotl.in/OwYLJ_SZ- - MYLS
抱歉... - lazarevzubov

10

问题是,你把C和A交换了位置,所以A B C D E变成了C B A D E。

你可以尝试类似这样的操作:

url.remove(itemToMove);
url.add(0, itemToMove);

或者如果url是一个LinkedList
url.remove(itemToMove);
url.addFirst(itemToMove);

4

以下是基于本主题其他答案的另一个Kotlin解决方案:

inline fun <T> List<T>.moveItemToFirstPosition(predicate: (T) -> Boolean): List<T> {
    for (element in this.withIndex()) {
        if (predicate(element.value)) {
            return this.toMutableList().apply {
                removeAt(element.index)
                add(0, element.value)
            }.toList()
        }
    }
    return this
}

使用方法:

var list = listOf("A", "B", "C", "D", "E")
list = list.moveItemToFirstPosition { it == "C" }

inline fun <T> MutableList<T>.moveItemToFirstPosition(predicate: (T) -> Boolean) {
    for (element in this.withIndex()) {
        if (predicate(element.value)) {
            removeAt(element.index)
            add(0, element.value)
            break
        }
    }
}

用法:

val list = mutableListOf("A", "B", "C", "D", "E")
list.moveItemToFirstPosition { it == "C" }

2

Kotlin ->

fun <T> MutableList<T>.move(item: T, newIndex: Int)  {
    val currentIndex = indexOf(item)
    if (currentIndex < 0) return
    removeAt(currentIndex)
    add(newIndex, item)
}

0
假设你有一个数组:
String[] arrayOne = new String[]{"A","B","C","D","E"};

现在你想把 C 放在索引 0 的位置,将 C 存入另一个变量中。

String characterC = arrayOne[2];

现在按照以下方式运行循环:

for (int i = (2 - 1); i >= 0; i--) {

            arrayOne[i+1] = arrayOne[i];
        }

2以上是C的索引。现在将C插入到索引位置,例如在0处。

arrayOne[0] = characterC;

以上循环的结果将会是这样:

arrayOne: {"C","A","B","D","E"}

最终,我们达成了我们的目标。


0
这段代码将允许您增加列表的大小,并插入元素,而不会影响列表的顺序。
private void insert(double price){
    for(int i = 0; i < keys.size(); i++){
        if(price > keys.get(i)){
            keys.add(null);
            for(int j = keys.size()-1; j > i; j--){
                Collections.swap(keys, j, j-1);
            }
            keys.add(price);
            Collections.swap(keys, keys.size()-1, i);
            keys.remove(keys.size()-1);
            return;
        }
    }
    keys.add(price);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接