简体   繁体   English

将列表的第一个元素移到末尾

[英]Move the first element of a list to the end

is there any clever way to do that ? 有什么聪明的方法吗? my best way was: 我最好的方法是:

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

if not is there any type of collection that will make that easier ? 如果没有,有没有什么类型的集合可以使这一切变得容易? I don't like the need of a temporary object to store the element i want to move .. 我不喜欢需要临时对象来存储要移动的元素。

EDIT: I have tested the propositions listed below, with my code: 编辑:我已经用我的代码测试了下面列出的命题:

    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) ;

here is the results: (profit: 15, ensure that the result is right for my code) code: 结果如下:(利润: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 ;
}

results: 结果:

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

code: 码:

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

results: 结果:

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

code: 码:

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

results: 结果:

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

code: 码:

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

result: 结果:

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

code: 码:

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

results: 结果:

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 

您可以为此使用Collections.rotate

Collections.rotate(list, -1);

I'm not exactly sure what you want to do, but here goes: 我不确定您要做什么,但是可以这样:

If you're using something like an ArrayList , you can do: 如果您使用ArrayList类的东西,则可以执行以下操作:

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

Please keep in mind that remove from an ArrayList runs in linear time, that is, O(N) , so that is extremely inefficient. 请记住,从ArrayList中remove是线性时间(即O(N) ,因此效率极低。

In case you can choose the type of List, you probably want a LinkedList , that implementes the Dequeue interface, so it would allow you to do something like: 如果您可以选择List的类型,则可能需要一个LinkedList ,它实现了Dequeue接口,因此它将允许您执行以下操作:

list.offer(list.poll());

Both offer and poll are operations done in constant time. offerpoll都是在固定时间内完成的操作。

If you want to use a builtin from the Collections class, you can do as @dasblinkenlight suggested and use Collections.rotate(list, -1); 如果要使用Collections类中的内置函数,可以按照@dasblinkenlight的建议进行操作,并使用Collections.rotate(list, -1); ;。 (adding it here for completeness). (为了完整性起见,请在此处添加)。

您不需要临时变量,只需编写:

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

The obvious answer is: 显而易见的答案是:

list.add(list.remove(0))

which is the most elegant way, I believe. 我相信这是最优雅的方式。 You could alternatively use 您也可以使用

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

however that will change position of another element (the last one). 但是,这将改变另一个元素(最后一个)的位置。 You could also use Collections.rotate(list, -1) , however rotating the list could mean moving all of its elements (it depends on List implementation I guess) and that might not be efficient. 您也可以使用Collections.rotate(list, -1) ,但是旋转列表可能意味着移动其所有元素(这取决于我猜想的List实现),但这可能并不高效。

您需要出 (双端队列的缩写)。

You can also use LinkedList#addLast() method. 您也可以使用LinkedList#addLast()方法。

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

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM