将if/else块转换为三元运算符时的错误答案

bhu*_*esh 0 java arrays

我试图将我的java代码从if/else块转换为三元运算符.

我的代码正在做的是找到一个数组的位置,例如,已经出现了所有整数值的位置,

如果是数组 {1,1,3,4,2,3,4,5,1,4}

答案是7因为当我的程序迭代到7th位置时,它已经发现所有先前的数字小于5.

如果数组是{3,1,1,2,1,3}答案将是3因为当我的程序迭代到3数组的位置时,它已经迭代了所有小于的值3.

现在,当我使用if/else块时,我的代码工作正常.

这是对我来说绝对合适的代码,

public static int solution1 (int arrayMaxValue, int[] myArray){

    boolean b[] = new boolean[arrayMaxValue + 1];
    for (int i = 0; i < myArray.length; i++) {
        if (!b[myArray[i]]){
            b[myArray[i]] = true;
            if (b[myArray[i]]==true)
                arrayMaxValue--;
        }
        if (arrayMaxValue==0) return i;
    }
    return -1;
}
Run Code Online (Sandbox Code Playgroud)

但如果我将其if块转换为ternary operator ?

它输出错误,

public static int solution2 (int arrayMaxValue, int[] myArray){
        boolean b[] = new boolean[arrayMaxValue + 1];
        for (int i = 0; i < myArray.length; i++) {


            b[myArray[i]] = (!b[myArray[i]]) ? true : false;
            if (b[myArray[i]]){
                arrayMaxValue--;
            }


            if (arrayMaxValue==0) return i;
        }
        return -1;
    }
Run Code Online (Sandbox Code Playgroud)

这是我检查它的方式,

    int[] myArray = { 1,1,1,2,3,4,1 };
    // _ _ _ _ _
    int arrayMaxValue =4;

    System.out.println(solution1(arrayMaxValue, myArray));
    System.out.println("==============================");
    System.out.println(solution2(arrayMaxValue, myArray));
Run Code Online (Sandbox Code Playgroud)

上面数组的输出应该是5因为当循环迭代到位置5时,所有小于或等于的值4都被发现,第一个解决方案给出正确答案但第二个解决方案没有.

这是上述数组的两种解决方案的输出,

5
==============================
4
Run Code Online (Sandbox Code Playgroud)

我在三元运算符中做错了什么?

Era*_*ran 5

在三元运算符版本中,arrayMaxValue如果b[myArray[i]]在执行三元运算符后为真,则递减,并且三元运算符否定值b[myArray[i]].

b[myArray[i]] = (!b[myArray[i]]) ? true : false;
Run Code Online (Sandbox Code Playgroud)

是相同的

b[myArray[i]] = !b[myArray[i]];
Run Code Online (Sandbox Code Playgroud)

在原始版本中,arrayMaxValue只有当b[myArray[i]]从false更改为true时才会递减,并且您永远不会b[myArray[i]]从true 更改为false.

我不认为三元运算符在您的代码中很有用,因为您的条件不仅仅是b[myArray[i]]根据条件分配值- 它还具有递减的副作用arrayMaxValue.您可以通过以下方式简化代码:

if (!b[myArray[i]]) {
    b[myArray[i]] = true;
    arrayMaxValue--;         
}
Run Code Online (Sandbox Code Playgroud)

为了让三元运算符b[myArray[i]]为原始代码分配相同的值,它应该是:

b[myArray[i]] = (!b[myArray[i]]) ? true : b[myArray[i]];
Run Code Online (Sandbox Code Playgroud)

(这是一种复杂的写作方式b[myArray[i]] = true;)

但是arrayMaxValue--b[myArray[i]]它存在并且保持为真时也将被执行,这与原始实现的逻辑不同.