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

时间:2018-05-09 20:11:25

标签: java swing numbers jlist alphabet

我正试图通过按下“运行”按钮将所有单词(字母)从JList1替换为与其在JList2中的位置对应的数字。 (例如A到01)如果它不是英文字母,那么就把它保留原样。资本化并不重要(a和A仍为01),并且应保留空格。

出于视觉目的:

https://i.stack.imgur.com/PYhYA.png

“苹果!”应转换为“0116161205!”
“堆栈溢出”到“1920010311 1522051806121523”
“über”到“ü020518”

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

2 个答案:

答案 0 :(得分:1)

这是一个解决方案:

//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

答案 1 :(得分:0)

所以给...

  

(例如A到01)如果它不是英文字母,那么就把它保留原样。资本化并不重要(a和A仍为01),并且应保留空格。

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

  • 我们不关心非英文字符,因此我们可以免除UTF编码的问题
  • 资本化并不重要
  • 应保留空格

这些观点让我感兴趣的原因是它意味着我们只对一小部分人物感兴趣(1-26)。这立即向我尖叫“ASCII”!

这提供了一个即时查找表,它不需要我们预先生成任何东西,它可以立即访问。

快速查看any ascii table为我们提供了所需的所有信息。 A-Z的范围为65-90(因为我们不关心案例,我们无需担心小写范围。

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

嗯,现在这意味着主要问题变成了,“我们如何将char转换为int?”,这非常简单!由于支持ASCII编码,char可以同时是“字符”和“数字”!

因此,如果您要打印(int)'A',则会打印65!由于所有字符都是有序的,我们只需要从64中减去65即可获得1

基本上你的整个问题就在那里解决了!

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

基于上述“可能”的解决方案看起来像......

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