Java:将字符串中的所有字符编码按常量值进行移位

7

这样可以:

for (char c : sourceString.toCharArray()) 
    destString += (char) (c + shiftValue);

System.out.println(destString);

有更好/更快(优化)的方法吗?


1
由于您的代码可以正常工作,因此将其发布在**codereview.stackexchange.com**上会更加合适。 - Markus Mitterauer
3个回答

10

开始时,我希望您避免使用重复的字符串连接。这是一个非常著名的性能问题。

在这种情况下,您知道需要开始的确切长度,因此甚至不需要StringBuilder - 只需要一个char[]就可以了:

char[] result = new char[srcString.length()];
for (int i = 0; i < result.length; i++) {
    result[i] = (char) (srcString.charAt(i) + shiftValue);
}
String destString = new String(result);

(The 使用toCharArray方法将答案转换为字符数组并逐个覆盖每个元素也很好,尽管我认为性能差异应该很小。如果这是真正关键的代码,您需要在实际系统中进行测试。重点是两种方法都是O(N)方法,而不是O(N2)方法。)
(然而,您应该考虑是否真的只想进行移位 - 大多数这样的练习更像是旋转而不是移位,例如,如果您从A-Z开始,那么结束时也应该是A-Z... 移位值为1应将Z更改为A,而不是“Z之后的Unicode字符”(即[)。这可能不是您的情况要求的,但您肯定应该考虑。)

7
一个更简短的版本。在循环中不需要每次调用charAt(i)
char[] result = srcString.toCharArray();
for (int i = 0; i < result.length; i++) {
    result[i] += shiftValue;
}
String destString = new String(result);

2
是的,有:

是的,有:

StringBuilder destString = new StringBuilder();
for (char c : srcString.toCharArray()) {
    destString.appned((char) (c + shiftValue));
}
System.out.println(destString.toString());

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接