如何知道字符数组索引的排列而不按字母顺序顺序关于"ciberin" Java。


    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'检查它)。

最新更新