Реализую поиск выбором на Java, метод searchIndexSmallest ищет минимальное значение и возвращает int, метод sortSearch требует переделать его boolean
Реализую алгоритм поиск выбором на Java из книги Адитъя Бхаргава "Грокаем алгоритмы" (в книге пример на Python), метод searchIndexSmallest ищет минимальное значение и возвращает int, используя его, метод sortSearch заполняет новый лист в порядке убывания, но у меня он требует переделать searchIndexSmallest из int в boolean. Почему и куда копать не пойму. Прошу подсказать!
import java.util.ArrayList;
import java.util.Collections;
public class Current {
public static void main(String[] args) {
Integer [] array = {7, 5, 3, 4, 9, 1, 2, 6, 8, 4, 7};
ArrayList<Integer> list= new ArrayList<>();
ArrayList<Integer> sortList = new ArrayList<>();
Collections.addAll(list, array);
System.out.println(sortSearch(list, sortList));
}
public static int searchIndexSmallest(ArrayList<Integer> list) {
int smallest = list.get(0);
for (int i = 0; i < list.size(); i++) {
if (smallest > i) {
smallest = list.get(i);
}
}
return smallest;
}
public static ArrayList<Integer> sortSearch(ArrayList<Integer> list, ArrayList<Integer> sortList) {
for (int i = 0; i < list.size(); i++) {
sortList.add(i) = searchIndexSmallest(list); // Make 'searchIndexSmallest' return 'boolean'
list.remove(i);
}
return sortList;
}
}
Ответы (2 шт):
Метод
sortList.add(i)
самодостаточен, к списку добавляется i, результат - boolean - успешно или нет.
Присваивать левой части ничего не надо. Возможно, вместо i вы хотели подставить результат searchIndexSmallest, но сначала реализуйте этот метод правильно
Ошибка не в том, что List::add возвращает boolean, а в попытке присвоить целочисленный результат, возвращаемый одним методом (searchIndexSmallest), результату другого метода:
error: unexpected type
sortList.add(i) = searchIndexSmallest(list); // Make 'searchIndexSmallest' return 'boolean'
^
required: variable
found: value
Для оператора присваивания в левой части должна быть переменная.
Однако алгоритм содержит и другие логические ошибки, даже если исправить предыдущую:
- в методе
searchIndexSmallestзначение в спискеlistсравнивается с индексом, поэтому результат работы этого метода неправильный - в методе
sortSearchразмер спискаlistбудет уменьшаться после вызоваlist.remove, соответственно в "отсортированном" списке будет только половина значений
Вариант исправленного кода:
public static int findSmallest(ArrayList<Integer> list) {
int smallest = list.get(0);
for (int i = 0; i < list.size(); i++) {
if (smallest > list.get(i)) {
smallest = list.get(i);
}
}
return smallest;
}
public static ArrayList<Integer> sortSearch(ArrayList<Integer> list, ArrayList<Integer> sortList) {
for (int i = 0, n = list.size(); i < n; i++) {
Integer min = findSmallest(list);
sortList.add(min);
list.remove(min);
}
return sortList;
}
Важно, чтобы из исходного списка удалялось Integer значение, а не int индекс.
Вариант с индексами выглядит так:
public static int findSmallestIndex(ArrayList<Integer> list) {
int smallestIndex = 0;
for (int i = 1; i < list.size(); i++) {
if (list.get(smallestIndex) > list.get(i)) {
smallestIndex = i;
}
}
return smallestIndex;
}
public static ArrayList<Integer> sortSearch(ArrayList<Integer> list, ArrayList<Integer> sortList) {
for (int i = 0, n = list.size(); i < n; i++) {
int minIx = findSmallestIndex(list);
sortList.add(list.get(minIx));
list.remove(minIx);
}
return sortList;
}