Не повторяйте элемент ListIterator, если впоследствии используются next() и previous()

Когда вы используете next(), а затем previous() сразу после ListIterator, чтобы вернуть тот же элемент списка, как я могу сделать так, чтобы, если я буду использовать один за другим, он пропустил текущий элемент и перешел к следующему? Я пытаюсь использовать две кнопки для прокрутки назад и вперед между списком месяцев, и с моим текущим кодом, если я нажимаю "Далее" и хочу вернуться назад, мне нужно будет дважды нажать "Назад".

Label monthLabel = new Label(month);
    intoHbox.setConstraints(monthLabel, 1, 0);
    intoHbox.setConstraints(prevMonth, 0, 0);


    LinkedList<String> year = new LinkedList();
    year.add("January");
    year.add("February");
    year.add("March");
    year.add("April");
    year.add("May");
    year.add("June");
    year.add("July");
    year.add("August");
    year.add("September");
    year.add("October");
    year.add("November");
    year.add("December");


//make the current month the starting position
    int position = 0;
    for (String monthNow : year){
        if(monthNow.contains(month)){
            break;
        }
        else{
            position++;
        }
    }


    ListIterator<String> it = year.listIterator();
    it = year.listIterator(position + 1);
    positionInList = it;
    nextMonth.setOnAction(e -> {

        if (positionInList.hasNext()){
        String currentLabel = positionInList.next();
            monthLabel.setText(currentLabel);


        }
        else{
            positionInList = year.listIterator(0);

            monthLabel.setText(positionInList.next());
        }


    });


    prevMonth.setOnAction(e -> {

        if (positionInList.hasPrevious()){

            monthLabel.setText(positionInList.previous());

        }
        else{
            positionInList = year.listIterator(12);
            monthLabel.setText(positionInList.previous());
        }

    });

1 ответ

Вероятно, было бы проще сохранить текущую позицию в переменной и использовать ее напрямую.

Создайте небольшой служебный класс, который также поможет с тем фактом, что вы не можете изменить int внутри лямбда-выражения, если оно не является окончательным. Вы можете сделать это частным и включить его непосредственно в ваш основной класс.

private static class Position {
  private final List<String> year;
  private int position;

  Position(List<String> year, String current) {
    this.year = year;
    this.position = year.indexOf(current);
    if (this.position == -1) throw new IllegalArgumentException("Not a valid month: " + current);
  }

  String next() {
    ++position;
    if (position >= year.size()) position = 0;
    return year.get(position);
  }
  String previous() {
    --position;
    if (position < 0) position = year.size() - 1;
    return year.get(position);
  }
}

Тогда в вашем методе вы можете использовать:

Position position = new Position(year, month);

nextMonth.setOnAction(e -> monthLabel.setText(position.next());
prevMonth.setOnAction(e -> monthLabel.setText(position.previous());

Также обратите внимание, что было бы немного более эффективно использовать ArrayList в этом случае, потому что он поддерживает произвольный доступ в O(1) - хотя для такого небольшого списка разница будет небольшой.

Другие вопросы по тегам