使用两个 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-Z
在 65-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
我正在尝试通过按下 运行 按钮将 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-Z
在 65-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