我正在尝试将我的java代码从if / else块转换为三元运算符。
我的代码正在做的是找到一个数组的位置,在该位置已经出现了所有整数值,例如,
如果数组是{1,1,3,4,2,3,4,5,1,4}
答案是7
,因为当我的程序迭代到7th
位置时,它已经发现所有以前的数字都小于5.
如果数组是{3,1,1,2,1,3}
,答案将是3
,因为当我的程序迭代到数组的3
位置时,它已经迭代了所有小于{{{的值。 1}}。
现在,当我使用if / else阻止时,我的代码工作正常。
这是对我来说非常好的代码,
3
但如果我将其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;
}
块转换为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;
}
上面数组的输出应为 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
我在三元运算符中做错了什么?
答案 0 :(得分:5)
在三元运算符版本中,如果在执行三元运算符后arrayMaxValue
为真,则递减b[myArray[i]]
,并且三元运算符否定b[myArray[i]]
的值。
b[myArray[i]] = (!b[myArray[i]]) ? true : false;
与
相同b[myArray[i]] = !b[myArray[i]];
在原始版本中,只有当arrayMaxValue
从false更改为true且您永远不会将b[myArray[i]]
从true更改为false时,您才会递减b[myArray[i]]
。
我不认为三元运算符在您的代码中有用,因为您的条件不仅仅是根据条件将值赋给b[myArray[i]]
- 它还具有递减{{1}的副作用}。您可以通过这种方式简化代码:
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--
出现时执行,并且保持为真,这与原始实现的逻辑不同。
答案 1 :(得分:2)
这是我推荐的不代码。使用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;
}
要记住的主要事情是,如果您不想更改?:
结果分配的左侧,您可以使用其旧值作为替代方案之一。
答案 2 :(得分:2)
在上一个答案中,Eran正确地指出您使用的三元运算符只是一种复杂的写入方式
b[myArray[i]] = !b[myArray[i]];
在对Eran's anwer的评论中,您注意到您的任务是
使用if / else和ternary运算符设计此程序
肯定可以使用三元运算符。您只需要使用运算符来指定其他值。例如。 arrayMaxValue
的值:
for (int i = 0; i < myArray.length; i++) {
arrayMaxValue -= b[myArray[i]] ? 0 : 1;
b[myArray[i]] = true;
if (arrayMaxValue==0) return i;
}
在此代码中,您将使用三元运算符来决定是否将arrayMaxValue
递减1(如果b[myArray[i]]
为false
)或不归(b[myArray[i]]
为{ {1}}我们将减去0)。
P.S。请注意,在您的周期的每次迭代中,true
值始终设置为b[myArray[i]]
。