三元运算符如何工作?
How ternary operator works?
在codewars中,我用15行代码完成了一个使用for循环的套路,其他人只用了7行就完成了。谁能解释一下代码?
public class CamelCase {
public static String cAmEl(final String yourName) {
final int length = yourName.length();
final StringBuilder cAmEl = new StringBuilder(length);
boolean upper = true;
for (int i = 0; i < length; i++, upper ^= true) {
final char c = yourName.charAt(i);
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c));
}
return cAmEl.toString();
}
}
代码将字符串的每个备用字符转换为大写(以大写字符开头)。例如:test
变为 TeSt
.
这部分我看不懂
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c));
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c))
此行将下一个字符附加到 StringBuilder
。如果大写是 true
它附加 toUpperCase(c)
,如果大写是 false
则附加 toLowerCase(c) 。它使用三元运算符,类似于 :
if (upper)
cAmEl.append (toUpperCase(c));
else
cAmEl.append (toLowerCase(c));
由于大写在 true 和 false 之间交替(这就是 XOR 运算符在这里所做的 - upper ^= true
),这意味着输出字符将根据需要在大写和小写之间交替。
不是直接的答案,但您可以在一行(相当长的)代码中完成:
return yourName.length() <= 1 ? yourName.toUpperCase() : "" + Character.toUpperCase(yourName.charAt(0)) + Character.toLowerCase(yourName.charAt(1)) + cAmEl(yourName.substring(2));
或者稍微拆分一下:
return yourName.length() <= 1 ? yourName.toUpperCase() :
"" + Character.toUpperCase(yourName.charAt(0)) +
Character.toLowerCase(yourName.charAt(1)) +
cAmEl(yourName.substring(2));
你不明白的部分是三元的。
三元包含三部分。
第一部分:条件
upper
第二部分:真实陈述
toUpperCase(c)
第三部分:虚假陈述
toLowerCase(c)
正如您在 for 语句 upper 中所见,将异或字面值 true。
for (int i = 0; i < length; i++, upper ^= true)
所以在for语句的每一次迭代中,upper变量的值都会反转,所以会调用三元中的true语句和false语句。
在codewars中,我用15行代码完成了一个使用for循环的套路,其他人只用了7行就完成了。谁能解释一下代码?
public class CamelCase {
public static String cAmEl(final String yourName) {
final int length = yourName.length();
final StringBuilder cAmEl = new StringBuilder(length);
boolean upper = true;
for (int i = 0; i < length; i++, upper ^= true) {
final char c = yourName.charAt(i);
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c));
}
return cAmEl.toString();
}
}
代码将字符串的每个备用字符转换为大写(以大写字符开头)。例如:test
变为 TeSt
.
这部分我看不懂
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c));
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c))
此行将下一个字符附加到 StringBuilder
。如果大写是 true
它附加 toUpperCase(c)
,如果大写是 false
则附加 toLowerCase(c) 。它使用三元运算符,类似于 :
if (upper)
cAmEl.append (toUpperCase(c));
else
cAmEl.append (toLowerCase(c));
由于大写在 true 和 false 之间交替(这就是 XOR 运算符在这里所做的 - upper ^= true
),这意味着输出字符将根据需要在大写和小写之间交替。
不是直接的答案,但您可以在一行(相当长的)代码中完成:
return yourName.length() <= 1 ? yourName.toUpperCase() : "" + Character.toUpperCase(yourName.charAt(0)) + Character.toLowerCase(yourName.charAt(1)) + cAmEl(yourName.substring(2));
或者稍微拆分一下:
return yourName.length() <= 1 ? yourName.toUpperCase() :
"" + Character.toUpperCase(yourName.charAt(0)) +
Character.toLowerCase(yourName.charAt(1)) +
cAmEl(yourName.substring(2));
你不明白的部分是三元的。 三元包含三部分。 第一部分:条件
upper
第二部分:真实陈述
toUpperCase(c)
第三部分:虚假陈述
toLowerCase(c)
正如您在 for 语句 upper 中所见,将异或字面值 true。
for (int i = 0; i < length; i++, upper ^= true)
所以在for语句的每一次迭代中,upper变量的值都会反转,所以会调用三元中的true语句和false语句。