在java中编码给定字母表的单词



我正试图使一种方法,允许我传递一个字到数字考虑到字符数组这是我的方法和字母表给定:

public static final char[] CHARACTERS_SPACE = new char[]{'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X', 'Y', 'Z', ' '};
public static void codificate(String msg) {
char[] msgChar = msg.toCharArray();
ArrayList<Character> msgToNumbers = new ArrayList<>();
for (int i = 0; i < CHARACTERS_SPACE.length; i++) {
for (char c : msgChar) {
if (CHARACTERS_SPACE[i] == c){
msgToNumbers.add(c);
}
}
System.out.println(msgToNumbers.toString());
}
}

然而,当我比较它并打印数组时,我得到了排序的单词。例如,如果我想编码单词"acbd"输出是:[A,B,C,D]我不知道怎么做才能使单词以正确的顺序返回。

我不知道该怎么执行这个方法,因为我不明白为什么这个词要命令我。

这里需要做一些事情才能正常工作。要转换为的字符都是大写的,但提供的消息字符串是小写的。为了进行相等的比较,它们必须具有相同的字母大小写。考虑到这一点,将代码行if (CHARACTERS_SPACE[i] == c){更改为这样的内容:if (charactersSpace[i] == Character.toUpperCase(c)) {将对整个任务更有益。

同样,在同一个if块中,应该添加到msgToNumberArrayList(一个欺骗性的变量名)的不是c,而是CHARACTERS_SPACE[i]break;语句也可以直接添加到现在的msgToNumbers.add(CHARACTERS_SPACE[i]);语句下面,因为该字符已经找到,并且不需要对当前字符进行更多的内部循环迭代。这将有助于加快速度。

因此,为了维护所提供的msg字符串中的字符顺序,内部for循环声明应该移动,以构成外部循环。换句话说,外部和内部循环声明应该交换位置,例如:

public static void codificate(String msg) {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";   
final char[] charactersSpace = chars.toCharArray();

char[] msgChar = msg.toCharArray();
List<Character> msgToNumbers = new ArrayList<>();
for (char c : msgChar) {
for (int i = 0; i < charactersSpace.length; i++) {
if (charactersSpace[i] == Character.toUpperCase(c)) {
msgToNumbers.add(charactersSpace[i]);
break;
}
}
}
System.out.println(msgToNumbers);
}

还要注意代码行System.out.println(msgToNumbers);移到了....在for外循环之外。这样msgToNumbers列表就不会在每次外部循环迭代时打印到控制台窗口。


On A Side:

如果你想让上面的方法返回一个String,而不是在方法中执行控制台打印,那么你可以这样修改:

public static String codificate(String msg) {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ ";   
final char[] charactersSpace = chars.toCharArray();

char[] msgChar = msg.toCharArray();
List<Character> msgToNumbers = new ArrayList<>();
for (char c : msgChar) {
for (int i = 0; i < charactersSpace.length; i++) {
if (charactersSpace[i] == Character.toUpperCase(c)) {
msgToNumbers.add(charactersSpace[i]);
break;
}
}
}
return msgToNumbers.toString().replaceAll("[\[\], ]", "");
}

你可以使用这样的方法:

String str = codificate("adcb");
System.out.println(str);

控制台窗口将显示:

阿布扎比商业银行

最新更新