Reputation: 65
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));
Upvotes: 1
Views: 261
Reputation: 744
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.
Upvotes: 1
Reputation: 8819
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));
Upvotes: 1
Reputation: 393771
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.
Upvotes: 4