Java 左右旋转列表

Java 左右旋转列表,java,listiterator,Java,Listiterator,我正在考虑从列表中获取下一个和上一个元素,但我无法正确处理此问题-问题发生在列表的限制上。也许有人有更好的概念来解决这个问题 public class Test { private char heading = 'N'; List<Character> cardinal = Arrays.asList('N', 'E', 'S', 'W' ); ListIterator<Character> iterator = cardinal.listIte

我正在考虑从列表中获取下一个和上一个元素,但我无法正确处理此问题-问题发生在列表的限制上。也许有人有更好的概念来解决这个问题

public class Test {

    private char heading = 'N';
    List<Character> cardinal = Arrays.asList('N', 'E', 'S', 'W' );
    ListIterator<Character> iterator = cardinal.listIterator();

    public static void main(String[] args) {

        Test test = new Test();
        System.out.println("heading = " + test.heading);

        test.rotateLeft(); System.out.println("Rotating left...");
        System.out.println("heading = " + test.heading);
        test.rotateLeft(); System.out.println("Rotating left...");
        System.out.println("heading = " + test.heading); 
   }

    public void rotateRight() {
        this.heading =
            (iterator.hasNext() ? iterator.next() : cardinal.get(0));
    }  

    public void rotateLeft() {
        this.heading = 
                (iterator.hasPrevious() ? iterator.previous() : cardinal.get(3));
    }

}
公共类测试{
私有字符标题='N';
List cardinal=Arrays.asList('N','E','S','W');
ListIterator迭代器=基数.ListIterator();
公共静态void main(字符串[]args){
测试=新测试();
System.out.println(“heading=“+test.heading”);
test.rotateLeft();System.out.println(“向左旋转…”);
System.out.println(“heading=“+test.heading”);
test.rotateLeft();System.out.println(“向左旋转…”);
System.out.println(“heading=“+test.heading”);
}
公共void rotateRight(){
这个标题=
(iterator.hasNext()?iterator.next():cardinal.get(0));
}  
公屋轮候册(){
此标题=
(iterator.hasPrevious()?iterator.previous():cardinal.get(3));
}
}

问题在于当到达列表末尾时,没有重置迭代器。从那时起,
iterator.hasNext()
将始终返回false。一个简单的解决方法:

public void rotateRight() {
    if (!iterator.hasNext())
        iterator = cardinal.listIterator();
    this.heading = iterator.next();
}

public void rotateLeft() {
    if (!iterator.hasPrevious())
        iterator = cardinal.listIterator(cardinal.size());
    this.heading = iterator.previous();
}
如果您的列表是
最终版
,则更容易:

int index = 0;

public void rotateRight() {
    index = (index + 1) % cardinal.size();
    this.heading = cardinal.get(index);
}

public void rotateLeft() {
    index = (index - 1 + cardinal.size()) % cardinal.size();
    this.heading = cardinal.get(index);
}

问题是,当到达列表末尾时,没有重置迭代器。从那时起,
iterator.hasNext()
将始终返回false。一个简单的解决方法:

public void rotateRight() {
    if (!iterator.hasNext())
        iterator = cardinal.listIterator();
    this.heading = iterator.next();
}

public void rotateLeft() {
    if (!iterator.hasPrevious())
        iterator = cardinal.listIterator(cardinal.size());
    this.heading = iterator.previous();
}
如果您的列表是
最终版
,则更容易:

int index = 0;

public void rotateRight() {
    index = (index + 1) % cardinal.size();
    this.heading = cardinal.get(index);
}

public void rotateLeft() {
    index = (index - 1 + cardinal.size()) % cardinal.size();
    this.heading = cardinal.get(index);
}

你熟悉吗?Collections.rotate会修改整个集合,效率不高。但这是一个小程序,所以我相信它会飞起来…谢谢路易斯的回复!然而,这个函数改变了列表的组成,但我创建了我的列表作为最终的-很抱歉没有提到它。我想从列表中检索下一个或上一个元素。您熟悉吗?Collections.rotate修改整个集合,效率不高。但这是一个小程序,所以我相信它会飞起来…谢谢路易斯的回复!然而,这个函数改变了列表的组成,但我创建了我的列表作为最终的-很抱歉没有提到它。我想从列表中检索下一个或上一个元素。感谢Andrew的回复!对我来说很好,但是第一次旋转不起作用-你知道为什么吗?它被关闭了一次,只需从rotateLeft上取下
-1
。此外,如果您的列表是最终的,您甚至不需要使用迭代器。你可以只使用一个索引,然后改变它。安德鲁,你真了不起!真的非常感谢你的帮助-我会浪费更多我自己的时间。谢谢安德鲁的回复!对我来说很好,但是第一次旋转不起作用-你知道为什么吗?它被关闭了一次,只需从rotateLeft上取下
-1
。此外,如果您的列表是最终的,您甚至不需要使用迭代器。你可以只使用一个索引,然后改变它。安德鲁,你真了不起!真的非常感谢你的帮助——我会浪费更多的时间。