2

我有两个字符串plainTextkey. 现在,如果plainText.length > key.length然后我必须重复密钥,直到它的长度与plainText. 这是一个例子:

plainText = "helloworld"
key="foobar"

因此密钥应增加到“foobarfoob”。

一种解决方案是重复整个单词,然后删除最后一个字符,直到它达到与 plainText 相同的长度,例如 "foobarfoobar" ,然后删除字符 "ar" 。

在java中有没有更好(或者更确切地说是优雅)的方法来做到这一点?

4

3 回答 3

8

除了删除最后一个字符的方式之外,您的解决方案似乎是合理的 - 不要一次执行一个,只需使用 substring 或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();

或者只是将附加调用更改为仅获得正确的大小:

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

我的建议(诚然不是很容易解释,但紧凑而高效) - 它根据需要多次重复 key + 1 并使用 substring 删除多余的字符:

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

您可以遍历键并在每一步中计算步骤(应该是等于纯文本 => 停止的时间)并将每个步骤的这些字符添加到键中。这是在一个循环中完成的

于 2012-08-05T07:24:53.120 回答