2

私は2つの文字列を持っていplainTextますkey. さて、 の場合はplainText.length > key.lengthと同じ長さになるまでキーを繰り返さなければなりませんplainText。例を次に示します。

plainText = "helloworld"
key="foobar"

したがって、キーを「foobarfoob」に増やす必要があります。

1 つの解決策は、単語全体を繰り返してから、 "foobarfoobar" などの plainText と同じ長さに達するまで最後の文字を削除してから、文字 "ar" を削除することです。

Javaでこれを行うためのより良い(またはエレガントな)方法はありますか?

4

3 に答える 3

8

あなたの解決策は、最後の文字を削除する方法以外は合理的です。一度に1つずつ実行しないでください。部分文字列またはを使用してStringBuilder.setLength()ください。

// Make sure we never have to expand...
StringBuilder builder = new StringBuilder(plainText.length() + key.length() - 1);
while (builder.length() < plainText.length()) {
    builder.append(key);
}
builder.setLength(plainText.length());
String result = builder.toString();

または、append 呼び出しを変更して、適切なサイズのみを取得するようにします。

StringBuilder builder = new StringBuilder(plainText.length());
while (builder.length() < plainText.length()) {
    builder.append(key.substring(0, Math.min(key.length(),
                                        builder.length() - plainText.length()));
}
String result = builder.toString();

個人的には最初のほうが好きです - よりシンプルです。

于 2012-08-05T07:23:58.407 に答える
1

私の提案(確かにあまり自明ではありませんが、コンパクトで効率的です)-キーを必要な回数+ 1繰り返し、部分文字列を使用して余分な文字を削除します:

public static void main(String[] args) throws Exception {
    String plainText = "helloworld";
    String key = "foobar";
    int repeat = plainText.length() / key.length();
    int remainder = plainText.length() % key.length();

    String result = new String(new char[repeat + 1]).replaceAll(".", key).substring(0, key.length() * repeat + remainder);
    System.out.println(result);
}
于 2012-08-05T07:25:20.780 に答える
0

キーをループして、すべてのステップでステップをカウントし(プレーンテキスト=>停止に等しい時間になるはずです)、すべてのステップのそれらの文字をキーに追加できます。これは 1 つのループで行われます

于 2012-08-05T07:24:53.120 に答える