如果随后使用next()和previous(),请不要重复ListIterator元素

时间:2017-07-12 16:29:04

标签: java listiterator

当你在ListIterator之后使用next()然后使用previous()将返回列表中的相同元素时,我怎么能这样做呢?如果我一个接一个地使用它会跳过当前元素并转到下一个元素?我尝试使用两个按钮在月份列表和我当前的代码之间来回滚动,如果我按下,我想回去,我需要按两次。

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 个答案:

答案 0 :(得分:0)

将当前位置存储在变量中并直接使用它可能更简单。

创建一个小的实用程序类,如果它不是最终的,那么你也可以帮助修改lambda中的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)中的随机访问 - 尽管对于这么小的列表,差异会很小。