反转 Java for 循环中访问列表的顺序

问题描述 投票:0回答:3

我想反转在

for
语句中访问列表的顺序。

这是我的实际代码:

for(int i = 0; i < states.size(); i++) {
    System.out.println(states.size());
    states.get(i).update(true); // restore the first blockstate
    states.remove(i); // remove the first blockstate from the list
}

这段代码有效,但我想反转它。我已经尝试过其他方法,例如使用

i--
但它不起作用。有人可以提供建议吗?

java iteration
3个回答
6
投票

我已经尝试过其他方法,例如使用

i--
,但它不起作用。

反转

for
循环由三个步骤组成:

  • 将初始值更改为最后一个值,
  • 更改条件为通过初始值后停止
  • 反转增量/减量(即
    ++
    变为
    --

在您的代码中,此更改将如下所示:

for(int i = states.size()-1 ; i >= 0 ; i--) {
    System.out.println(states.size());
    states.get(i).update(true); // restore the current blockstate
    states.remove(i); // remove the current blockstate from the list
}

请注意,原始循环中达到的最后一个值是

states.size()-1
,而不是
states.size()
,因此
i
也需要从
states.size()-1
开始。

由于您的循环最终会清除列表,但一次只清除一个元素,因此您可以通过删除

remove(i)
的调用,并在循环后将其替换为
states.clear()
来获得更好的清晰度。

for(int i = states.size()-1 ; i >= 0 ; i--) {
    System.out.println(states.size());
    states.get(i).update(true); // restore the current blockstate
}
states.clear();

0
投票

试试这个:

List list = Lists.reverse(states); 
for(int i = 0; i < list.size(); i++) {
    System.out.println(list.size());
    list.get(i).update(true); // restore the first blockstate
    //list.remove(i); // remove the first blockstate from the list
 }

如果你想在访问元素时删除元素,那么你必须使用简单的迭代器,因为这是不可能的......它会抛出并发修改异常


0
投票
for (ListIterator<State> i = states.listIterator(states.size()); i.hasPrevious(); ) {
    State value = i.previous();

    System.out.println(states.size());
    value.update(true); // restore the first blockstate
    i.remove(); // remove the first blockstate from the list
}

您指定的所需代码以相反的顺序迭代列表中的每个元素,并为其访问的每个元素执行以下操作:

  1. 打印列表中剩余元素数
  2. 在当前元素上调用
    update
    方法
  3. 从列表中删除当前元素

ListIterator
类允许以相反的顺序迭代列表、访问每个元素以及从列表中删除当前元素。 因此,它可以用来实现您既定的目标。

© www.soinside.com 2019 - 2024. All rights reserved.