有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

关于“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”的名称


共 (1) 个答案

  1. # 1 楼答案

    您应该使用整数集来存储有效值。我的意思是:

    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”,所以我们应该用“validvalue”检查它)