在我的計算機科學課的作業中,我需要使用哈希姆圖將一條訊息轉換為加密的訊息。我們被告知,要用一個由a-z小寫字母組成的替換字母表中的字符來替換給定資訊字串中的所有字符。此外,替換應按字母順序進行。
因此,舉例來說,如果我們得到的資訊是 "hello",我們的密碼應該將h映射到a,e映射到b,l映射到c,o映射到d,這樣我們就得到了字串abccd。從理論上講,這似乎并不難,但我在字符的實際轉換上遇到了很多麻煩。我已經在我打算進行實際轉換的地方加了一個注釋,但是到目前為止,我得到的回報只是一堆a和b的組合。我在這里做錯了什么呢?
預先感謝任何幫助。
編輯:洗掉了一些多余的代碼,感謝 @taha
public class Encryption {
public String encrypt(String message){
StringBuilder convertedMessage = new StringBuilder() 。
int counter = 0;
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray()。
HashMap<Character, Character> converter = new HashMap<>()。
String messageholder = message.toLowerCase() 。
char[] charMessage = messageholder.toCharArray()。
//this statement is what's giving me an aneurysm.
for (char i : charMessage ) {
converter.putIfAbsent(i, alphabet[counter])。
counter ;
}
for (Character c : converter.keySet() ){
char value = converter.get(c)。
convertedMessage.append(value)。
}
return convertedMessage.toString()。
}
}
uj5u.com熱心網友回復:
該代碼似乎有2個主要問題:
試圖從輸入的資訊中洗掉非字母字符。
public static String encrypt(String message){
StringBuilder convertedMessage = new StringBuilder() 。
int counter = 0;
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray()。
HashMap<Character, Character> converter = new HashMap<>()。
//只保留小寫的英文字母。
message = message.replaceAll("[^A-Za-z]", "").toLowerCase()。
for (char i : message.toCharArray() ) {
converter.putIfAbsent(i, alphabet[counter ])。
convertedMessage.append( converter.get(i))。
}
return convertedMessage.toString();
}
// Test
System.out.println(encrypt("Hello,World!") )。
輸出:
abccefehcj
然而,上面的代碼在每次從輸入資訊中查找一個字符時都會更新計數器,因此一些值可能會被跳過。例如,
d被跳過,因為counter在hello中的第二個l被增加了。同樣地,g在world中第二次出現時,o被跳過,等等。
因此,使用方法Map::computeIfAbsent而不是Map::putIfAbsent可能是有意義的,后者只在需要時呼叫一個函式來修改計數器。
在這種情況下,counter應該被實作為一個有效的最終變數,因為它被用于一個lambda函式中--作為一個陣列或者AtomicInteger:
int[] counter = new int[1] 。//或 AtomicInteger counter = new AtomicInteger();
for (char i : charMessage ) {
converter.computeIfAbsent(i, k -> alphabet[counter[0] )。
//for AtomicInteger converter.computeIfAbsent(i, k -> alphabet[counter.getAndIncrement()]);
convertedMessage.append( converter.get(i))。
}
然后,Hello World!的加密字串看起來是這樣的:
abccdedfcg
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/333330.html
標籤:
