如何在for循环括号内使用三元运算符实现双向遍历?
解决for循环根据布尔值动态控制遍历方向的问题
我来帮你搞定这个问题!你想用三元运算符优化遍历方向、避免重复写两个for循环的思路很合理,但之前的写法踩到了Java语法的几个坑,我来逐个分析并给出可行的解决方案:
先说说你之前写法的错误原因
第一种写法的问题
for (hotbarFirst ? (x = 0; x < mc.player.inventoryContainer.getInventory().size(); x++) : (x = mc.player.inventoryContainer.getInventory().size(); x > 0; x--)) {
Java的三元运算符?:要求左右两边必须是单个表达式,而你这里把for循环的三个完整部分(初始化、条件、增量)塞了进去,这属于多个语句的组合,编译器根本无法识别,所以会报unexpected token错误。
第二种写法的问题
for (hotbarFirst ? (x = 0) : (x = mc.player.inventoryContainer.getInventory().size()); hotbarFirst ? (x < mc.player.inventoryContainer.getInventory().size()) : (x > 0); hotbarFirst ? (x++) : (x--)){ }
这个写法的结构更接近正确,但有两个问题:
- 变量
x没有提前声明(原代码里x是在for循环内用int x声明的,这里直接用x会导致未定义错误); - 反向遍历的边界逻辑错误:正向遍历是从
0到size-1,反向应该从size-1开始,终止条件是x >= 0,而你写的x = size和x > 0会跳过最后一个有效索引,还会多遍历一次无效的size索引。
可行的解决方案
我推荐两种方式,你可以根据可读性选择:
方式1:修复三元运算符的for循环写法
提前获取inventory的大小(避免重复调用方法提升性能),声明变量x,然后在for循环的三个部分分别用三元判断:
public static int getItem(Item itemofChoice, boolean hotbarFirst) { if (mc.player == null) return -1; int inventorySize = mc.player.inventoryContainer.getInventory().size(); int x; // 根据hotbarFirst决定遍历的起始值、终止条件、增量 for (x = hotbarFirst ? inventorySize - 1 : 0; hotbarFirst ? x >= 0 : x < inventorySize; hotbarFirst ? x-- : x++) { // 原循环体的逻辑不变 if ((x == 0 || x == 5 || x == 6 || x == 7 || x == 8)) continue; ItemStack s = mc.player.inventoryContainer.getInventory().get(x); if (s.isEmpty()) continue; if (s.getItem().equals(itemofChoice)) return x; } return -1; }
方式2:用步长变量简化逻辑(可读性更好)
把遍历的起始值、终止值、步长提前计算好,这样for循环的结构更清晰,避免重复的三元判断:
public static int getItem(Item itemofChoice, boolean hotbarFirst) { if (mc.player == null) return -1; int inventorySize = mc.player.inventoryContainer.getInventory().size(); int start = hotbarFirst ? inventorySize - 1 : 0; int end = hotbarFirst ? -1 : inventorySize; // 终止值是遍历的"边界外"值 int step = hotbarFirst ? -1 : 1; for (int x = start; x != end; x += step) { // 原循环体逻辑不变 if ((x == 0 || x == 5 || x == 6 || x == 7 || x == 8)) continue; ItemStack s = mc.player.inventoryContainer.getInventory().get(x); if (s.isEmpty()) continue; if (s.getItem().equals(itemofChoice)) return x; } return -1; }
这两种方式都能实现你要的效果:当hotbarFirst为true时反向遍历,无需写两个重复的for循环。
内容的提问来源于stack exchange,提问作者Arthur TeaTree




