How ternary operator works?

239 views Asked by At

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

There are 3 answers

0
A.v On BEST ANSWER

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.

0
rghome On

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));
1
Eran On
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.