How ternary operator works?

2019-08-07 19:31发布

In codewars I have completed a kata using for loop with 15 lines of code, some other person has completed it with just 7 lines. Could anybody explain the code?

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();
    }
}

The code converts every alternate character of a string to uppercase (starting with an uppercase character). For example: test becomes TeSt.

I am unable to understand this part

cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c));

3条回答
ゆ 、 Hurt°
2楼-- · 2019-08-07 20:07

The part you don't understand is a ternary. Ternary contains of three parts. part one: Condition

upper

part two: True statement

toUpperCase(c)

part three: False Statement

toLowerCase(c)

As you can see in for statement upper will be XOR to literal value true.

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

So in each iterate of the for statement value of upper variable will be reverse, so true statement and false statement in ternary will be called.

查看更多
干净又极端
3楼-- · 2019-08-07 20:21
cAmEl.append(upper ? toUpperCase(c) : toLowerCase(c))

This line appends the next character to a StringBuilder. It appends toUpperCase(c) if upper is true and toLowerCase(c) if upper case is false. It uses the ternary operator, which is similar to :

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

Since upper alternates between true and false (that's what the XOR operator does here - upper ^= true), this means that the output characters will alternate between upper case and lower case, as required.

查看更多
祖国的老花朵
4楼-- · 2019-08-07 20:24

Not a direct answer, but you can do it in one (quite long) line of code:

return yourName.length() <= 1 ? yourName.toUpperCase() : "" + Character.toUpperCase(yourName.charAt(0)) + Character.toLowerCase(yourName.charAt(1)) + cAmEl(yourName.substring(2)); 

or splitting it up a bit:

return yourName.length() <= 1 ? yourName.toUpperCase() : 
    "" + Character.toUpperCase(yourName.charAt(0)) +  
         Character.toLowerCase(yourName.charAt(1)) + 
         cAmEl(yourName.substring(2));
查看更多
登录 后发表回答