Java 将if/else块转换为三值运算符时回答错误

Java 将if/else块转换为三值运算符时回答错误,java,arrays,Java,Arrays,我正在尝试将我的java代码从if/else块转换为三值运算符 我的代码所做的是查找一个数组的位置,在这个数组中,所有整数的值都已经出现了,例如 如果数组是{1,1,3,4,2,3,4,5,1,4} 答案应该是7,因为当我的程序迭代到7位置时,它已经发现前面所有的数字都小于5 如果数组是{3,1,1,2,1,3},答案将是3,因为当我的程序迭代到数组的3位置时,它已经迭代了所有小于3的值 现在,当我使用if/else块时,我的代码运行良好 这是对我来说绝对有效的代码 public static

我正在尝试将我的java代码从if/else块转换为三值运算符

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

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

答案应该是
7
,因为当我的程序迭代到
7
位置时,它已经发现前面所有的数字都小于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;
}
我就是这样检查的

    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));
上述数组的输出应该是
5
,因为当循环迭代到位置5时,所有小于或等于
4
的值都被发现,第一个解决方案给出了正确答案,而第二个解决方案没有

这是上述阵列的两种解决方案的输出

5
==============================
4

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

在三元运算符版本中,如果执行三元运算符后
b[myArray[I]]
为真,并且三元运算符对
b[myArray[I]]的值求反,则您正在递减
arrayMaxValue

b[myArray[i]] = (!b[myArray[i]]) ? true : false;

b[myArray[i]] = !b[myArray[i]];
在原始版本中,只有当
b[myArray[i]
从false变为true时,您才将
arrayMaxValue
递减,并且从不将
b[myArray[i]]
从true变为false

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

if (!b[myArray[i]]) {
    b[myArray[i]] = true;
    arrayMaxValue--;         
}
为了使三元运算符将与原始代码相同的值分配给
b[myArray[i]]
,它应该是:

b[myArray[i]] = (!b[myArray[i]]) ? true : b[myArray[i]];
(这是一种编写
b[myArray[i]]=true;
的复杂方法)


但是
arrayMaxValue--
也将在
b[myArray[i]]
为并保持为true时执行,这与原始实现的逻辑不同。

这是而不是我推荐的代码。使用if/else比使用这种方式,您的函数更干净、可读性更强。我认为这主要是为了说明为什么人们通常应该忽略
?:

但是,仅使用
?:
重写函数是一个挑战

  public static int solution3(int arrayMaxValue, int[] myArray) {
    int result = -1;
    boolean b[] = new boolean[arrayMaxValue + 1];
    for (int i = 0; i < myArray.length && result == -1; i++) {
      arrayMaxValue = b[myArray[i]] ? arrayMaxValue : arrayMaxValue - 1;
      b[myArray[i]] = true;
      result = (arrayMaxValue == 0) ? i : result;
    }
    return result;
  }
publicstaticint解决方案3(int-arrayMaxValue,int[]myArray){
int结果=-1;
布尔b[]=新布尔[arrayMaxValue+1];
对于(int i=0;i

要记住的主要一点是,如果您不想更改
?:
结果赋值的左侧,您可以使用其旧值作为备选值之一。

在前面的回答中,Eran正确地指出,您使用的三元运算符只是一种复杂的写入方式
b[myArray[i]=!b[myArray[i]]
在对Eran anwer的评论中,您注意到您的任务是

使用if/else和三值运算符设计该程序

使用三元运算符当然是可能的。您只需要使用运算符来指定其他值。例如,
arrayMaxValue
的值:

for (int i = 0; i < myArray.length; i++) {
  arrayMaxValue -= b[myArray[i]] ? 0 : 1;
  b[myArray[i]] = true;
  if (arrayMaxValue==0) return i;
}
for(int i=0;i
在这段代码中,您将使用三元运算符来决定是否将
arrayMaxValue
递减1(如果
b[myArray[i]
false
),或者不递减(如果
b[myArray[i]
true,我们将递减0)


请注意,
b[myArray[i]]
值在您的周期的每次迭代中总是设置为
true

我没有收到您的回复,对不起,您能详细说明一下吗?我试着一次又一次地阅读我的Ternary运算符代码,但它似乎与if/else相同block@bhuvesh我试图澄清。我们被告知要同时使用if/else和三元运算符来设计这个程序…为什么不能使用三元运算符:s..还有,如果我用'if(!b[myArray[I]]){b[myArray[I]]来重新设计三元运算符=true;arrayMaxValue--;}`这不是和第一个一样吗?@bhuvesh当然可以使用三元运算符,但我不会使用它,因为它会降低代码的可读性。您需要确定
b
元素在每种情况下的值,并将该值放入三元表达式中。是否要将
b
元素更改为false?
for (int i = 0; i < myArray.length; i++) {
  arrayMaxValue -= b[myArray[i]] ? 0 : 1;
  b[myArray[i]] = true;
  if (arrayMaxValue==0) return i;
}