Переместить первый элемент списка в конец

есть ли хитрый способ сделать это ? мой лучший способ был:--13-->

object next = list.get(0) ;
list.remove(0) ;
list.add(next) ;

если нет, есть ли какой-либо тип коллекции, который облегчит это ? Мне не нравится необходимость временного объекта для хранения элемента, который я хочу переместить ..

EDIT: я проверил предложения, перечисленные ниже, с моим кодом:

    long starttime = System.nanoTime() ;
    for (int i = 0; i < ntours; i++){
        profit += retrieveGroupsWillPlay(groups, ngroups, limit) ;
    }
    long endtime = System.nanoTime() ;
    System.out.println("Timing: " + (endtime - starttime)) ;
    System.out.println("Profit: " + profit) ;

вот результаты: (прибыль: 15, убедитесь, что результат подходит для моего код) код:

private static int retrieveGroupsWillPlay(ArrayList<Integer> queue,int ngroups, int limit) { 
    int peopleWillPlay = 0 ;
    for (int i = 0; i < ngroups; i++){
        int nextGroup = queue.get(0) ;
        if(limit >= peopleWillPlay + nextGroup) {
            peopleWillPlay += nextGroup ;
            queue.add(nextGroup) ;
            queue.remove(0) ;
        }
        else break ;
    }
    return peopleWillPlay ;
}

результаты:

Timing: 23326
Profit: 15
Timing: 22171
Profit: 15
Timing: 22156
Profit: 15
Timing: 22944
Profit: 15
Timing: 22240
Profit: 15
Timing: 21769
Profit: 15
Timing: 21866
Profit: 15
Timing: 22341
Profit: 15
Timing: 24049
Profit: 15
Timing: 22420
Profit: 15

код:

private static int retrieveGroupsWillPlay(ArrayList<Integer> queue,int ngroups, int limit) { 
    int peopleWillPlay = 0 ;
    for (int i = 0; i < ngroups; i++){
        int nextGroup = queue.get(0) ;
        if(limit >= peopleWillPlay + nextGroup) {
            peopleWillPlay += nextGroup ;
            Collections.rotate(queue, -1) ;
        }
        else break ;
    }
    return peopleWillPlay ;
}

результаты:

Timing: 92101
Profit: 15
Timing: 87137
Profit: 15
Timing: 84531
Profit: 15
Timing: 105919
Profit: 15
Timing: 77019
Profit: 15
Timing: 84805
Profit: 15
Timing: 93393
Profit: 15
Timing: 77079
Profit: 15
Timing: 84315
Profit: 15
Timing: 107002
Profit: 15

код:

private static int retrieveGroupsWillPlay(ArrayList<Integer> queue,int ngroups, int limit) { 
    int peopleWillPlay = 0 ;
    for (int i = 0; i < ngroups; i++){
        int nextGroup = queue.get(0) ;
        if(limit >= peopleWillPlay + nextGroup) {
            peopleWillPlay += nextGroup ;
            queue.add(queue.remove(0)) ;
        }
        else break ;
    }
    return peopleWillPlay ;
}

результаты:

Timing: 28079
Profit: 15
Timing: 28994
Profit: 15
Timing: 29525
Profit: 15
Timing: 22240
Profit: 15
Timing: 38326
Profit: 15
Timing: 33742
Profit: 15
Timing: 21500
Profit: 15
Timing: 22714
Profit: 15
Timing: 20939
Profit: 15
Timing: 30157
Profit: 15

код:

private static int retrieveGroupsWillPlay(LinkedList<Integer> queue,int ngroups, int limit) { 
    int peopleWillPlay = 0 ;
    for (int i = 0; i < ngroups; i++){
        int nextGroup = queue.get(0) ;
        if(limit >= peopleWillPlay + nextGroup) {
            peopleWillPlay += nextGroup ;
            queue.addLast(queue.removeFirst()) ;
        }
        else break ;
    }
    return peopleWillPlay ;
}

результат:

Timing: 31104
Profit: 15
Timing: 42332
Profit: 15
Timing: 36443
Profit: 15
Timing: 31840
Profit: 15
Timing: 31387
Profit: 15
Timing: 32102
Profit: 15
Timing: 31347
Profit: 15
Timing: 30666
Profit: 15
Timing: 32781
Profit: 15
Timing: 32464
Profit: 15

код:

private static int retrieveGroupsWillPlay(LinkedList<Integer> queue,int ngroups, int limit) { 
    int peopleWillPlay = 0 ;
    for (int i = 0; i < ngroups; i++){
        int nextGroup = queue.get(0) ;
        if(limit >= peopleWillPlay + nextGroup) {
            peopleWillPlay += nextGroup ;
            queue.offer(queue.poll()) ;
        }
        else break ;
    }
    return peopleWillPlay ;
}

результаты:

Timing: 35389
Profit: 15
Timing: 34849
Profit: 15
Timing: 43606
Profit: 15
Timing: 41796
Profit: 15
Timing: 51122
Profit: 15
Timing: 59302
Profit: 15
Timing: 32340
Profit: 15
Timing: 35654
Profit: 15
Timing: 34586
Profit: 15
Timing: 35479
Profit: 15 

6 ответов


Я не совсем уверен, что вы хотите сделать, но здесь идет:

если вы используете что-то вроде ArrayList, вы можете сделать:

list.add(list.remove(0));

пожалуйста, имейте в виду, что remove из ArrayList работает в линейном времени, то есть O(N), так что это крайне неэффективно.

в случае, если вы можете выбрать тип списка, вы, вероятно, хотите LinkedList, что implementes в Dequeue интерфейс, так что это позволит вам сделать что-то например:

list.offer(list.poll());

и offer и poll операции выполняются в постоянное время.

если вы хотите использовать встроенный из Collections класс, вы можете сделать, как @ dasblinkenlight предложил и использовать Collections.rotate(list, -1); (добавляя его здесь для полноты).


можно использовать Collections.rotate для этого:

Collections.rotate(list, -1);

вам не нужна переменная temp просто напишите:

list.add(list.remove(0));

ответ очевиден:

list.add(list.remove(0))

который является самым элегантным способом, я считаю. Вы можете альтернативно использовать

Collections.swap(list.get(0), list.get(list.size()-1))

однако это изменит положение другого элемента (последнего). Вы также можете использовать Collections.rotate(list, -1), однако поворот списка может означать перемещение всех его элементов (это зависит от реализации списка, я думаю), и это может быть неэффективно.


вы также можете использовать LinkedList#addLast () метод.

list.add(next) ;     
list.addLast(list.removeFirst());

вы хотите dequeu (сокращение от double ended queue).