Ваши имена переменных и области действительно сбивают с толку, много дублированного кода.
for (j = i + 1; j > list.size(); j++)
- эта строка кода никогда не будет выполняться в большинстве случаев.
Это исправление для вашего нисходящего порядка:
// the same walk as for ASC but reversed comparison
for (int i = 0; i < list.size() - 1; i++) {
candidateIndex = i;
for (int j = i + 1; j < list.size(); j++) {
if (list.get(candidateIndex).getYear() < list.get(j).getYear()) {
candidateIndex = j;
}
}
temp = list.get(i);
list.set(i, list.get(candidateIndex));
list.set(candidateIndex, temp);
}
Вам определенно нужно взглянуть на Comparator :
Функция сравнения, которая накладывает общее упорядочение на некоторые
коллекция предметов. Компараторы могут быть переданы в метод сортировки
(например, Collections.sort или Arrays.sort), чтобы обеспечить точное управление
по порядку сортировки. Компараторы также могут быть использованы для контроля заказа
определенных структур данных (таких как отсортированные наборы или отсортированные карты), или
обеспечить порядок для коллекций объектов, которые не имеют
естественный порядок.
Упорядочение, наложенное компаратором c на набор элементов S, называется
быть согласованным с равными тогда и только тогда, когда c.compare (e1, e2) == 0 имеет
то же самое логическое значение, что и e1.equals (e2) для каждых e1 и e2 в S.
Я напишу полный пример с использованием компараторов:
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Comparator;
import java.util.List;
public class Main {
/**
* Defining comparator for ascending order by default
*/
public static final Comparator<Movies3> COMPARATOR = (m1, m2) -> m1.getYear() - m2.getYear();
public static void main(String[] args) {
List<Movies3> movies = new ArrayList<>(
Arrays.asList(new Movies3(1990), new Movies3(1995), new Movies3(2000)));
sortYears(movies, true);
System.out.println(movies);
sortYears(movies, false);
System.out.println(movies);
}
public static void sortYears(List<Movies3> list, boolean asc) {
int candidateIndex; // index of candidate whatever min or max
Movies3 temp;
Comparator<Movies3> comparator;
if (asc) {
comparator = COMPARATOR;
} else {
comparator = COMPARATOR.reversed(); // switch to DESC order
}
for (int i = 0; i < list.size() - 1; i++) {
candidateIndex = i;
for (int j = i + 1; j < list.size(); j++) {
if (comparator.compare(list.get(candidateIndex), list.get(j)) > 0) {
candidateIndex = j;
}
}
temp = list.get(i);
list.set(i, list.get(candidateIndex));
list.set(candidateIndex, temp);
}
}
}
Выход:
[year 1990, year 1995, year 2000]
[year 2000, year 1995, year 1990]
Вы также можете позволить вашему классу реализовать Comparable , чтобы определить для него естественный порядок и использовать его вместо Comparator
.