2012-08-05 14 views
1

一定的長度,我有兩個字符串plainTextkey。現在,如果plainText.length > key.length的話,我不得不重複鍵,直到它的長度相同的plainText。這裏有一個例子:重複串序列,直到它到達的Java

plainText = "helloworld" 
key="foobar" 

因此關鍵應該增加到「foobarfoob」。

一種解決方案是重複整個單詞,然後,直到它到達相同的長度,如「foobarfoobar」明文的刪除最後一個字符,然後刪除字符「AR」。

有沒有更好的(或者說和優雅)的方式在Java中做到這一點?

回答

6

您的解決方案似乎是合理的,比你刪除最後一個字符的方式等 - 不這樣做一次一個,只要使用字符串或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(); 

我個人更喜歡第一個 - 它更簡單。

+0

第一個更好,更簡單!感謝您的幫助:) – md1hunox 2012-08-05 07:34:56

0

可以遍歷鍵,並在每一步數的步驟(這應該是一段時間等於明文=>停止),並添加每一步鍵的那些字符。這是一個循環

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); 
} 
+0

嗯......我不同意。這比使用'StringBuilder'和一個循環更緊湊或更高效。當然,這很複雜。 – 2012-08-05 07:31:45

+0

@StephenC想過之後 - 我想我同意!它對代碼高爾夫比生產代碼更有用;-) – assylias 2012-08-05 07:32:51

+0

@assylias感謝您的回答:) – md1hunox 2012-08-05 07:36:49

相關問題