You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何在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--)){ }

这个写法的结构更接近正确,但有两个问题:

  1. 变量x没有提前声明(原代码里x是在for循环内用int x声明的,这里直接用x会导致未定义错误);
  2. 反向遍历的边界逻辑错误:正向遍历是从0size-1,反向应该从size-1开始,终止条件是x >= 0,而你写的x = sizex > 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;
}

这两种方式都能实现你要的效果:当hotbarFirsttrue时反向遍历,无需写两个重复的for循环。

内容的提问来源于stack exchange,提问作者Arthur TeaTree

火山引擎 最新活动