我正在编写小程序,并希望通过循环访问数组中的元素。我需要为下一次迭代增加“数组索引”变量。
以下是代码:
winner[turn] = subField[(int)Math.floor(i / 10.0)][i % 10].equalsIgnoreCase("O") ? false : winner[turn];
turn++;
是否可以从中创建一行代码?
PS:我正在尝试为自己写少行。这是对大脑和逻辑的训练。答案 0 :(得分:4)
嗯,可以肯定这样做:
winner[turn] = subField[(int)Math.floor(i / 10.0)][i % 10].
equalsIgnoreCase("O") ^ winner[turn++];
看那里甚至没有三元运营商。
但不是因为它更短更好(当然也不是更清晰)。所以我建议你这么多行:
String aSubField = subField[(int)Math.floor(i / 10.0)][i % 10];
if (aSubField.equalsIgnoreCase("O"))
winner[turn] = false;
turn++;
看,即使比较产生false
,也不需要分配值。
[编辑]
YAY!刚刚发现我的XOR错了......这只是高尔夫的问题,花了很多时间才弄清楚它是错误的....(在这种情况下,如果cond是真的,但之前的值是假的,它赢了不行。)
所以让我以其他方式打高尔夫球:)
winner[turn] = !subField[i/10][i%10].equalsIgnoreCase("O") & winner[turn++];
注意!和&
[编辑]
感谢@Javier给我一个更紧凑和混乱的版本:)这一个:
winner[turn++] &= !subField[i/10][i%10].equalsIgnoreCase("O");
答案 1 :(得分:2)
让我们分解一下。你拥有的是:
winner[turn] = (some condition) ? false : (expression involving turn)
(increment turn)
那么,为什么不在数组访问中增加转弯?这意味着它会在您评估右侧表达式时增加,但您可以根据需要轻松将其调整回其先前的值。
winner[turn++] = (some condition) ? false : (expression involving (turn - 1) )