2015-06-20 28 views
1

在codewars中,我已经用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)); 
+0

它的一个if-else,如果上面那么toUpperCase()else toLowerCase() – Sajal

+0

[Ternary Operator-JAVA]可能的重复(http://stackoverflow.com/questions/25163713/ternary-operator-java) –

+0

可能的[Ternary Operators Java]的副本(http://stackoverflow.com/questions/21219695/ternary-operators-java) – byako

回答

1

你不”的一部分不明白是三元的。三元组包含三部分。 第一部分:条件

upper 

两部分:真实的陈述

toUpperCase(c) 

三部分:虚假陈述

toLowerCase(c) 

正如你可以看到在声明上会XOR字面值真正。

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

所以在每个for语句的迭代中,上层变量的值会相反,所以在三元中的真语句和假语句会被调用。

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

此行附加下一字符到StringBuilder。如果上限为true,则附加toUpperCase(c);如果大写为false,则附加至下限(c)。它使用三元运算符,它是类似于:

​​

由于真假(这是XOR运算符做什么位置 - upper ^= true)之间的上交替,这意味着输出字符将上壳体和下之间交替情况下,根据需要。

+0

非常感谢,精彩的解释。 – krishna

+0

虽然这是真的,'布尔? foo:bar'是三元运算符(就像'++'是一元的,'a * b'是二元的),只是因为Java没有更多的三元运算符,人们正在使用“三元”,就好像它是这个名字一样运营商。但是由于我们无法保证未来Java不会添加更多的三元运算符,所以最好使用它的专有名称“[conditional operator]”(http://docs.oracle.com/javase/specs/jls /se8/html/jls-15.html#jls-15.25)”。 – Pshemo

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)); 
相关问题