我有两个字符串plainText
和key
。现在,如果plainText.length > key.length
那么我必须重复密钥,直到它与plainText
的长度相同。这是一个例子:
plainText = "helloworld"
key="foobar"
因此,密钥应该增加到“foobarfoob”。
一种解决方案是重复整个单词,然后删除最后一个字符,直到它达到与“foobarfoobar”之类的plainText相同的长度,然后删除字符“ar”。
在java中有没有更好(或更优雅)的方法呢?
答案 0 :(得分:7)
您的解决方案似乎是合理的,除了删除最后一个字符的方式 - 不要一次只执行一次,只需使用子字符串或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();
就我个人而言,我更喜欢第一种 - 它更简单。
答案 1 :(得分: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);
}
答案 2 :(得分:0)
你可以循环键,并在每一步计算步骤(应该是一段时间等于明文=&gt;停止)并将每一步的字符添加到键。这是在一个循环中完成的