char alphabet[] = {'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'};
Scanner scanner = new Scanner(System.in);
String msg = scanner.nextLine();
char Array_of_msg[] = msg.toCharArray();
String key = scanner.nextLine();
char[] Array_of_key = key.toCharArray();
char[] SortedKey = key.toCharArray();
Arrays.sort(SortedKey);
char[] result_msg = new char[Array_of_msg.length];
int[] Array_of_indexKey = new int[Array_of_key.length];
int y = 0;
for (int i = 0; i < Array_of_key.length; i++) {
for (y = 0; y < SortedKey.length; y++) {
if (Array_of_key[i] == SortedKey[y] ) {
Array_of_indexKey[i] = y;
}
}
}
for (int aa = 0; aa < Array_of_indexKey.length; aa++) {
System.out.print(Array_of_indexKey[aa]);
}
这段代码适用于字符串"Hani" -> "1032"
,但不适用于像"gamal" -> "20413"
那样具有两次字符"A"的名称。
您应该使用整数集来存储有效值。我的意思是:
Set<Integer> validValues = new HashSet<>();
for (int i = 0; i < input.length; ++i) {
validValues.add(i);
}
for (int i = 0; i < Array_of_key.length; i++) {
for (y = 0; y < SortedKey.length; y++) {
if (Array_of_key[i] == SortedKey[y] && validValues.contains(y)) {
Array_of_indexKey[i] = y;
validValues.remove(y);
break; // this is very important, without it you get 21403
}
}
}
在您的实现中,让我们看看输入为"gamal"的情况。然后排序后的数组是'aaglm',内部循环两次找到第一个'a'(这个内部for循环在第二次中不知道,它之前找到了这个'a',所以我们应该用'validValues'检查它)。