How to move specific item in array list to the first item
Asked Answered
P

8

96

For example : A list

A B C D E

Given C , Switch to

C A B D E

Notice that the array size will change, some items may removed in run times

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

This statement is not working because it output C B A D E not C A B D E , how to fix it?

Thanks.

Plotinus answered 25/11, 2013 at 7:15 Comment(0)
O
136

What you want is a very expensive operation in an ArrayList. It requires shifting every element between the beginning of the list and the location of C down by one.

However, if you really want to do it:

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

If this is a frequent operation for you, and random access is rather less frequent, you might consider switching to another List implementation such as LinkedList. You should also consider whether a list is the right data structure at all if you're so concerned about the order of elements.

Ostap answered 25/11, 2013 at 7:19 Comment(3)
if speed is a criteria, then maybe you should also look at commons.apache.org/proper/commons-collections/javadocs/…Oshea
@Oshea broken link now.Tersina
Here is the new link - commons.apache.org/proper/commons-collections/javadocs/api-4.4/…Oshea
W
22

Do this:

  1. Remove the element from the list: ArraylistObj.remove(object);
  2. Add the element back to the list at specific position: ArrayListObj.add(position, Object);

As per your code use this :

url.remove("C");
url.add(0,"C");
Wordy answered 25/11, 2013 at 7:19 Comment(2)
isn't it will increase the size of list?Benner
Then remove the element from list by using url.remove("C"); and add element at zero position by using url.add(0,"C");Wordy
M
14

Another solution, just keep swaping from 0 to indexOf(itemToMove).

This is my Kotlin version:

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

Sorry I am unfamiliar with Java but learned a little Kotlin. But the algorithm is the same.

Misbelief answered 5/12, 2017 at 13:6 Comment(3)
It gives "C, B, A, D, E" on output instead of "C, A, B, D, E".Invitation
@Invitation you can test it at Kotlin Playground, e.g. pl.kotl.in/OwYLJ_SZ-Misbelief
My apologies...Invitation
W
10

The problem is, you swap C with A, so A B C D E becomes C B A D E.

You could try something like this:

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

Or if url is a LinkedList:

url.remove(itemToMove);
url.addFirst(itemToMove);
Willettawillette answered 25/11, 2013 at 7:22 Comment(0)
A
4

One more Kotlin solution based on other answers from this thread:

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
}

Usage:

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

OR

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
        }
    }
}

Usage:

val list = mutableListOf("A", "B", "C", "D", "E")
list.moveItemToFirstPosition { it == "C" }
Acrolein answered 6/10, 2022 at 10:32 Comment(0)
E
2

Kotlin ->

fun <T> MutableList<T>.move(item: T, newIndex: Int)  {
    val currentIndex = indexOf(item)
    if (currentIndex < 0) return
    removeAt(currentIndex)
    add(newIndex, item)
}
Evalyn answered 6/7, 2022 at 16:30 Comment(0)
O
0

This code will allow you to increase size of list, and insert elements without otherwise disturbing order of list

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);
}
Odalisque answered 27/2, 2015 at 2:8 Comment(0)
D
0

Let say you have an array:

String[] arrayOne = new String[]{"A","B","C","D","E"};

Now you want to place the C at index 0 get the C in another variable

String characterC = arrayOne[2];

Now run the loop like following:

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

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

Above 2 is index of C. Now insert C at index for example on 0

arrayOne[0] = characterC;

Result of above loop will be like that:

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

The end, we achieve our goal.

Depurative answered 21/10, 2016 at 11:52 Comment(0)

© 2022 - 2024 — McMap. All rights reserved.