java - 如何使用hashmap将字符设置为等于不同的字符?

标签 java encryption hashmap

对于我的 compsci 类中的作业,我需要使用 HashMap 将消息转换为加密消息。我们被告知要通过将给定消息字符串中的所有字符替换为替换字母表中的字符来实现此目的,该替换字母表由从 az 的小写字母组成。此外,替换应按字母顺序进行。

例如,如果我们收到消息“hello”,我们的密码应将 h 映射到 a,将 e 映射到 blcod,得到字符串 abccd。从理论上讲,这似乎并不难,但我在字符的实际转换方面遇到了很多麻烦。我在打算进行实际转换的地方添加了一条注释,但到目前为止,我返回的只是一堆 ab放在一起。我在这里做错了什么?

预先感谢您的帮助。

编辑:由于@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();
    }
}

最佳答案

代码似乎有两个主要问题:

  1. 尝试从输入消息中删除非字母字符
  2. 根本不需要第二个循环,一旦选择了密码字符,就应该在迭代输入消息的同时构建加密消息。
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/

相关文章:

hashmap - LinkedHashMap的排序

java - 我的 JDBC select 准备语句有什么问题?

java - 在 JSP 中迭代 ArrayList

java - 如何使用 Weblogic Server 使用 java 访问属性文件?

java - 从子上下文引用在父上下文中创建的 Spring Singletons

java - 哈希函数将k个最近的数据映射到同一个桶中

encryption - 解密 .m3u8 播放列表并使用 ffmpeg 将其合并为单个 .mp4 文件

c - 在 AES 密码对象上禁用 PKCS#7 填充?

encryption - 使用 node-forge 将 ssh 公钥从各种格式转换为 Open SSH

java - get() 如何在 hashmap 上工作