Как получить вывод на основе 2 разных массивов

#java #arrays #sorting #min

Вопрос:

У меня возникли проблемы с созданием вывода на основе 2 разных массивов. Например, у меня есть 2 массива «A» и «B». Я отсортировал элементы в порядке возрастания, используя этот метод:

 public static void sortOrder(int [] A) {
    for(int i = 0; i < A.length; i  ) {
        for(int k = i   1; k < A.length; k  ) {
            if(A[i] > A[k]) {
                int temp = A[i];
                A[i] = A[k];
                A[k] = temp;
            }
        } 
    }
}
 

Я хочу вывести B[i]- е наименьшее число в массиве A.

Например, после сортировки массив A = [3, 5, 7, 8, 11, 21] и B-это [1, 3, 5].

Желаемый результат [3, 7, 11], так как 1-й наименьший элемент A равен 3, 3-й наименьший элемент A равен 7, а 5-й наименьший элемент A равен 11.

До сих пор это то, что я придумал:

 public static void Algorithm1(int [] A, int [] B) {
    sortOrder(A);
    sortOrder(B);
    
    int[] result = new int[B.length];
    int min = A[0];
    
    for(int i = 0; i < A.length; i  ) {
        for(int k = 0; k < B.length; k  ) {
            if(B[k] <= min) {
                result[k] = A[k];
            }
        }
    }
    System.out.println(Arrays.toString(result));
    //A is [3, 5, 7, 8, 11, 21]
    //B is [1, 3, 5]
    //Desired output is [3, 7, 11]
    }
 

Запустив этот код, я получаю вывод [3, 5, 0]. Я знаю, что проблема, вероятно, связана с вложенным циклом for, но ни за что на свете я не могу понять, как ее решить. Извините, если я недостаточно ясно объяснил, чего я хочу, так как я все еще новичок в программировании.

Заранее спасибо!!

Комментарии:

1. Попробуйте пройти через отладчик, чтобы увидеть, в чем проблема

2. Почему вы использовали второй вложенный цикл для заполнения массива результатов? Простой цикл от 0 result.length того места, где вы затем сделаете result[i] = A[B[i]-1]; , — это все, что вам нужно. Я действительно не вижу, как вложенный цикл необходим или даже полезен в этом случае.

Ответ №1:

Вам не нужно иметь вложенный цикл и проходить через оба массива, вам просто нужно пройти через result.length или B.length (так как они всегда равны), взять значение B[i] - 1 и использовать его в качестве индекса для доступа A . Это оставляет вас с result[i] = A[B[i] - 1]; .

Фиксированный Код:

 public static void Algorithm1(int [] A, int [] B) {
    sortOrder(A);
    sortOrder(B);
    
    int[] result = new int[B.length];
    
    for(int i = 0; i < result.length; i  ) {
        result[i] = A[B[i] - 1];
    }
    System.out.println(Arrays.toString(result));
}
 

Тестовый запуск:

 public static void main(String args[]) throws Exception {
    
    int [] arr1 = new int[]{21, 8, 11, 7, 5, 3};
    int [] arr2 = new int[]{3, 5, 1};

    Algorithm1(arr1, arr2);
    
}
 

Выход:

 [3, 7, 11]
 

Ответ №2:

Это решение, которое работает так, как вы хотите:

 public static void Algorithm1(int [] A, int [] B) {
    sortOrder(A);
    sortOrder(B);
    
    int[] result = new int[B.length];
    
    for(int i = 0; i < B.length; i  ) {
        // take the B[i]th element minus one because array starts from 0
        result[i] = A[B[i] - 1];
    }

    System.out.println(Arrays.toString(result));
    //A is [3, 5, 7, 8, 11, 21]
    //B is [1, 3, 5]
    //Desired output is [3, 7, 11]
}