繁体   English   中英

三元运算符如何工作?

[英]How ternary operator works?

在codewar中,我用15行代码完成了一个for循环的kata,其他人仅用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 其附加toUpperCase(c) ,如果上是true和toLowerCase(c)若大写是false 它使用三元运算符,类似于:

if (upper)
    cAmEl.append (toUpperCase(c));
else
    cAmEl.append (toLowerCase(c));

由于大写字母在true和false之间交替(这就是XOR运算符在这里所做的-upper 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进行XOR。

for (int i = 0; i < length; i++, upper ^= true)

因此,在每个迭代中,较高变量的for语句的值将是相反的,因此将调用三元组中的true语句和false语句。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM