Результат, который вам нужно достичь, можно разбить на 2 основных шага:
- Описание того, как, давая 2
Word
с, какой из них будет поставлен перед другим в List
- Использование метода сравнения для фактической сортировки списка
Word
с.
Шаг 1. Как определить, какое слово стоит первым?
Java имеет интерфейс под названием Comparable
. Название довольно очевидно. Когда вы реализуете этот интерфейс в своем классе Word
, вы говорите Java, что экземпляры этого класса можно сравнивать друг с другом.
public class Word implements Comparable<Word>{
Когда вы редактируете эту строку в своем классе Word
ваша IDE, вероятно, будет жаловаться на «отсутствующий compareTo()
метод». Метод compareTo()
определен в интерфейсе Comparable
, и его задача из 2 экземпляров определяет, какой из них следует считать «большим» (или, в нашем случае, должен быть помещен первым в List
).
Пример использования: "apple".compareTo("banana");
. Этот вызов метода должен возвращать положительное число, если первый экземпляр («яблоко») «больше», отрицательное число, если второй экземпляр («банан») «больше», или ноль, если оба имеют одинаковое «значение». , Кстати, метод compareTo()
, реализованный String
s в Java, оценивает экземпляры в алфавитном порядке.
Итак, давайте реализуем нашу версию метода compareTo()
для нашего класса Word
.
@Override
public int compareTo(Word anotherWord) {
if(this.percent > anotherWord.percent) {
return 1;
} else if (this.percent < anotherWord.percent) {
return -1;
} else {
return 0;
}
}
Имейте в виду, что эта реализация возвращает положительное значение, если первый экземпляр больше второго, и отрицательное значение наоборот.
Теперь, когда у нас есть способ сравнивая нашу Words
, мы можем перейти к части сортировки.
Шаг 2. Алгоритмы сортировки
В inte rnet доступно огромное количество алгоритмов сортировки. Некоторые из них менее эффективны, некоторые проще в реализации. Вы можете исследовать некоторые из них здесь .
Для меня самый простой алгоритм сортировки называется BubbleSort . Однако это не очень эффективно.
ArrayList<Word> objectArray = new ArrayList<Word>();
objectArray.add(new Word("people", 0.8));
objectArray.add(new Word("dogs", 0.4));
objectArray.add(new Word("cats", 0.6));
for(int i = 0; i < objectArray.size() - 1; i++) {
for(int j = 0; j < objectArray.size() - i - 1; j++) {
// Remember: a compareTo() call returning a negative number
// means that the first instance is smaller than the second.
if(objectArray.get(j).compareTo(objectArray.get(j + 1)) < 0) {
Word auxiliary = objectArray.get(j);
objectArray.set(j, objectArray.get(j + 1));
objectArray.set(j + 1, auxiliary);
}
}
}
Эти два вложенных цикла for
будут сортировать objectArray
в порядке убывания percent
.