Reputation: 13555
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.
Upvotes: 97
Views: 132607
Reputation: 1596
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" }
Upvotes: 4
Reputation: 965
Kotlin ->
fun <T> MutableList<T>.move(item: T, newIndex: Int) {
val currentIndex = indexOf(item)
if (currentIndex < 0) return
removeAt(currentIndex)
add(newIndex, item)
}
Upvotes: 2
Reputation: 1603
Do this:
ArraylistObj.remove(object);
ArrayListObj.add(position, Object);
As per your code use this :
url.remove("C");
url.add(0,"C");
Upvotes: 23
Reputation: 231
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.
Upvotes: 14
Reputation: 12040
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.
Upvotes: 137
Reputation: 1653
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.
Upvotes: 0
Reputation: 1
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);
}
Upvotes: 0
Reputation: 353
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);
Upvotes: 11