使用两个 JList 将字母转换为字母位置

Converting letters to alphabet position with two JLists

我正在尝试通过按下 运行 按钮将 JList1 中的所有单词(字母)替换为与其在字母表中对应于 JList2 的位置的数字。 (例如 A 到 01)如果它不是英文字母,则保持原样。大小写无关紧要(a 和 A 仍然是 01)并且应保留空格。

出于视觉目的:

"Apple!" 应转换为“0116161205!”
"stack Overflow" 到“1920010311 1522051806121523”
“über”到“ü020518”

我已经尝试了在这里找到的一些方法,但对如何在前 9 个字母前添加额外的 0 或保留空格一无所知。非常感谢任何帮助。

这是一个解决方案:

//Create a Map of character and equivalent number
Map<Character, String> lettersToNumber = new HashMap<>();
int i = 1;
for(char c = 'a'; c <= 'z'; c++) {
    lettersToNumber.put(c, String.format("%02d", i++));
}

//Loop over the characters of your input and the corresponding number
String result = "";
for(char c : "Apple!".toCharArray()) {
    char x = Character.toLowerCase(c);
    result+= lettersToNumber.containsKey(x) ? lettersToNumber.get(x) : c;
}

输入、输出

Apple!           => 0116161205!
stack Overflow   => 1920010311 1522051806121523
über             => ü020518

所以给出...

(ex. A to 01) And if it's not an English alphabet letter then leaving it as it is. Capitalization doesn't matter (a and A is still 01) and spaces should be kept.

这提出了一些有趣的观点:

  • 我们不关心非英文字符,所以我们可以省去 UTF 编码的问题
  • 大小写无关紧要
  • 应保留空格

我之所以对这些点感兴趣,是因为它意味着我们只对一小部分字符 (1-26) 感兴趣。这立即让我尖叫 "ASCII"!

这提供了即时查找 table,不需要我们预先生成任何内容,它可以立即访问。

快速浏览 any ascii table 即可为我们提供所需的所有信息。 A-Z65-90 的范围内(因为我们不关心大小写,所以我们不需要担心小写范围。

但这对我们有什么帮助!?

嗯,这意味着主要问题变成了 "How do we convert a char to an int?",这非常简单!由于 ASCII 编码支持,char 可以同时是 "character" 和 "number"!

所以如果你要打印 (int)'A',它会打印 65!由于所有字符都是有序的,我们只需要从 65 中减去 64 就可以得到 1!

基本上你的整个问题都解决了!

哦,好的,你需要处理不在 A-Z 之间的字符的边缘情况,但这只是一个简单的 if 语句

基于上述 "might" 的解决方案类似于...

public static String convert(String text) {
    int offset = 64;
    StringBuilder sb = new StringBuilder(32);
    for (char c : text.toCharArray()) {
        char input = Character.toUpperCase(c);
        int value = ((int) input) - offset;
        if (value < 1 || value > 25) {
            sb.append(c);
        } else {
            sb.append(String.format("%02d", value));
        }
    }
    return sb.toString();
}

现在,您可以通过多种方式来解决这个问题,我根据我对问题的理解和我的经验选择了一条路径。

并根据您的示例输入...

String[] test = {"Apple!", "stack Overflow", "über"};
for (String value : test) {
    System.out.println(value + " = " + convert(value));
}

会产生以下输出...

Apple! = 0116161205!
stack Overflow = 1920010311 1522051806121523
über = ü020518