Не повторяйте элемент 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) - хотя для такого небольшого списка разница будет небольшой.