【问题标题】:Java reverse the order of accessing a list in a for loopJava在for循环中反转访问列表的顺序
【发布时间】:2015-12-26 21:28:55
【问题描述】:

我想颠倒在 for() 中访问 List 的顺序

这是我的实际代码

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--,但它不起作用。有人可以提供建议吗?

【问题讨论】:

  • 可以使用内置方法Colletions.reverse
  • 另外注意,在for 循环内执行states.remove(i); 可能会引发ConcurrentModificationException。如果您需要遍历一个集合并在进行过程中删除一些东西,您应该坚持使用迭代器。
  • 你想做同样的事情,但从后面开始吗?
  • @Tunaki 我认为 OP 想要反转循环,而不是列表。
  • 是的,我想从后面开始

标签: java


【解决方案1】:

我已经尝试过其他方法,例如使用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();

【讨论】:

  • 是的,这可以工作,但你将如何在每个循环之间做一个间隔?我有一个新的 regenBlock(states).runTaskTimer(this, 40, 17);但现在不工作它循环非常快
【解决方案2】:

试试这个:

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
 }

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

【讨论】:

    猜你喜欢
    • 2011-04-04
    • 1970-01-01
    • 2020-05-06
    • 2017-05-06
    • 2017-03-04
    • 2017-11-06
    • 2016-06-07
    • 2020-07-30
    • 1970-01-01
    相关资源
    最近更新 更多