如何在for循环中使用三元运算符控制遍历方向?
解决Java中用布尔值控制for循环遍历方向的问题
嘿,我明白你想通过三元运算符简化代码、避免重复写两个for循环的想法,咱们先看看你那两种写法为啥报错,再给你个靠谱的解决方案。
为啥你的写法会报错?
第一种写法:
for (hotbarFirst ? (x = 0; x < mc.player.inventoryContainer.getInventory().size(); x++) : (x = mc.player.inventoryContainer.getInventory().size(); x > 0; x--)) {Java的
for循环语法要求三个部分(初始化、条件判断、增量)是独立的语句/表达式,你把这三个部分整个用三元运算符包裹,相当于试图把一个复合语句当成表达式返回,这完全不符合Java的语法规则,所以会报unexpected token错误。第二种写法:
for (hotbarFirst ? (x = 0) : (x = mc.player.inventoryContainer.getInventory().size()); hotbarFirst ? (x < mc.player.inventoryContainer.getInventory().size()) : (x > 0); hotbarFirst ? (x++) : (x--)){ }这里的问题主要在增量部分:
hotbarFirst ? (x++) : (x--)虽然是合法表达式,但Java的for循环第三部分需要是一个语句(statement),而不是单纯的表达式。这种三元表达式的写法会被编译器判定为不符合语句要求,所以报not a statement错误。
正确的实现方式
其实不用纠结在for循环里硬塞三元运算符,我们可以提前用三元确定遍历的起始值、终止条件和步长,这样代码更清晰,也完全符合语法:
public static int getItem(Item itemofChoice, boolean hotbarFirst) { if (mc.player == null) return -1; // 先获取 inventory 的大小,避免重复调用方法提升性能 int inventorySize = mc.player.inventoryContainer.getInventory().size(); // 根据 hotbarFirst 确定遍历的起始、终止和步长 int start = hotbarFirst ? inventorySize - 1 : 0; int end = hotbarFirst ? -1 : inventorySize; int step = hotbarFirst ? -1 : 1; for (int x = start; (hotbarFirst ? x > end : x < end); x += step) { // 跳过不需要检查的槽位 if (x == 0 || (x >= 5 && x <= 8)) continue; ItemStack s = mc.player.inventoryContainer.getInventory().get(x); if (s.isEmpty()) continue; if (s.getItem().equals(itemofChoice)) return x; } return -1; }
额外优化点
- 把
inventorySize提前存下来,避免每次循环都调用getInventory().size(),减少方法调用开销; - 把跳过槽位的判断
x == 0 || x == 5 || x == 6 || x == 7 || x == 8简化成x == 0 || (x >=5 && x <=8),逻辑更清晰。
这样写既不用写两个重复的for循环,也完全符合Java语法,还能根据hotbarFirst的布尔值灵活控制遍历方向~
内容的提问来源于stack exchange,提问作者Arthur TeaTree
相关产品推荐
相关产品推荐

