2016-02-11 10 views
1

Я думаю о получении следующего и предыдущего элемента из списка, однако я не могу справиться с этим правильно - проблема возникает в пределах списка. Может быть, у кого-то есть лучшая концепция для решения этой проблемы?Вращающийся список влево и вправо

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

} 
+1

Вы знакомы с [ 'Collections.rotate (List, Int)'] (https: // документы .oracle.com/JavaSE/7/документы/API/Java/Util/Collections.html # поворота (java.util.List,% 20int))? –

+0

Collections.rotate изменяет всю коллекцию, это не очень эффективно. Но это небольшая программа, поэтому я уверен, что она полетит ... –

+0

Спасибо Луи за ваш ответ! Однако эта функция меняет состав List, но я создал свой список как final - извините за не упомянутый об этом. Я предпочел бы получить следующий или предыдущий элемент из списка. –

ответ

0

Проблема в том, что, когда вы достигаете конца списка, вы не сбрасываете итератор. С этого момента 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(); 
} 

Если ваш список final, становится еще проще:

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); 
} 
+0

Спасибо, Андрей за ваш ответ! Выглядит отлично для меня, но первая ротация не работает - вы не знаете, почему? –

+0

О, ох, да. Будет обновлено ... –

+0

Это было отключено, просто уберите «-1» с rotateLeft. Кроме того, если ваш список является окончательным, вам даже не нужно использовать итератор. Вы можете просто использовать индекс и вместо этого изменить это. –