#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]
}