5

これは機能します:

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

System.out.println(destString);

より良い/より高速な (最適化された) 方法はありますか?

4

3 に答える 3

8

そもそも、文字列連結を繰り返し使用することは避けたいと思います。これは非常によく知られたパフォーマンスの問題です。

この場合、最初に必要な正確な長さはわかっているので、a も必要ありません。a で問題ありませStringBuilderchar[]

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

(各要素を使用してから上書きするという答えtoCharArrayもいいですが、パフォーマンスの違いは小さいと思います。これが本当にパフォーマンスが重要なコードである場合は、実際のシステムでテストすることをお勧めします。主なポイントはどちらも O(N 2 )ではなく O(N) アプローチです)。

ただし、本当に単にシフトしたいのかどうかを検討する必要があります。このようなほとんどのエクササイズは、シフトよりも回転です。たとえば、AZ で開始すると、AZ で終了する必要があります...シフト値 1 は Z を変更する必要があります。 「Z の後の Unicode 文字」(つまり[) ではなく、A に。それはあなたの場合の要件ではないかもしれませんが、確かにそれを考慮する必要があります.

于 2016-12-05T07:22:17.703 に答える
6

短いバージョン。charAt(i)ループのたびに呼び出す必要はありません。

char[] result = srcString.toCharArray();
for (int i = 0; i < result.length; i++) {
    result[i] += shiftValue;
}
String destString = new String(result);
于 2016-12-05T07:30:05.863 に答える
1

はいあります:

StringBuilder destString = new StringBuilder();
for (char c : srcString.toCharArray()) {
    destString.appned((char) (c + shiftValue));
}
System.out.println(destString.toString());
于 2016-12-05T07:23:39.833 に答える