三元运算符如何工作?

问题描述 投票:1回答:3

在代码大战中,我已经用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));
java ternary-operator
3个回答
1
投票

你不理解的部分是三元组。三元包含三部分。第一部分:条件

upper

第二部分:真实的陈述

toUpperCase(c)

第三部分:虚假陈述

toLowerCase(c)

正如您在for语句中看到的那样,上升将是XOR到字面值true。

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

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


4
投票
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c))

这一行将下一个字符附加到StringBuilder。如果上面是toUpperCase(c),它会附加true,如果大写是false,则附加到LowerCase(c)。它使用三元运算符,类似于:

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

由于upper在true和false之间交替(这是XOR运算符在这里做的 - upper ^= true),这意味着输出字符将根据需要在大写和小写之间交替。


1
投票

不是一个直接的答案,但你可以在一个(很长的)代码行中做到:

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));
© www.soinside.com 2019 - 2024. All rights reserved.