对于我的 compsci 类中的作业,我需要使用 HashMap 将消息转换为加密消息。我们被告知要通过将给定消息字符串中的所有字符替换为替换字母表中的字符来实现此目的,该替换字母表由从 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();
}
}
最佳答案
代码似乎有两个主要问题:
- 尝试从输入消息中删除非字母字符
- 根本不需要第二个循环,一旦选择了密码字符,就应该在迭代输入消息的同时构建加密消息。
public static String encrypt(String message){
StringBuilder convertedMessage = new StringBuilder();
int counter = 0;
char[] alphabet = "abcdefghijklmnopqrstuvwxyz".toCharArray();
HashMap<Character, Character> converter = new HashMap<>();
// keep only lower-case English letters
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
第二个 l
增加在hello
。同样,g
第二次出现 o
时将被跳过在world
等
因此,使用方法 Map::computeIfAbsent
可能是有意义的而不是Map::putIfAbsent
仅在需要时调用函数来修改计数器。
在本例中,counter
应该被实现为有效的最终变量,因为它在 lambda 函数中使用 - 作为数组或 AtomicInteger
:
int[] counter = new int[1]; // or 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
关于java - 如何使用hashmap将字符设置为等于不同的字符?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69282182/