Освой программирование играючи
/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000
Если объекты классов нужно упорядочивать, то применяйте к ним интерфейс Comparable. В этом случае у вас появляется возможность сравнивать объекты некоторым способом. У интерфейса есть один метод:
int compareTo(Object obj)
Метод сравнивает вызывающий объект с obj. Он возвращает 0, если значения равны, отрицательное значение, если вызывающий объект меньше параметра. В любом другом случае возвращается положительное значение.
Во многих классах интерфейс Comparable уже реализован, например, в классах Byte, Character, String, Short и т.д.
Вы также можете реализовать данный интерфейс в своём классе. Допустим, у вас есть класс Cat. По какому критерию вы будете сравнивать котов между собой? Это может быть возраст, вес или длина хвоста!
Создадим класс с двумя полями - имя и длина хвоста. Класс будет реализовывать интерфейс Comparable.
package ru.alexanderklimov.course;
import android.support.annotation.NonNull;
public class Cat implements Comparable {
String mName;
int mTail;
Cat(String name, int tail) {
this.mName = name;
this.mTail = tail;
}
@Override
public int compareTo(@NonNull Object o) {
Cat entry = (Cat) o;
int result = mTail - entry.mTail;
if (result != 0) {
return result / Math.abs(result);
}
return result;
}
}
Поместим котов в TreeSet и выведем их в отсортированном виде по длине хвоста.
button.setOnClickListener(new View.OnClickListener() {
@Override
public void onClick(View view) {
TreeSet<Cat> treeSet = new TreeSet<>();
treeSet.add(new Cat("Рыжик", 3));
treeSet.add(new Cat("Рыжик", 16));
treeSet.add(new Cat("Мурзик", 7));
treeSet.add(new Cat("Васька", 11));
treeSet.add(new Cat("Барсик", 5));
for(Cat cat : treeSet) {
System.out.println("Имя: " + cat.mName + ", длина хвоста: " + cat.mTail);
}
}
});
Если длины хвостов у всех котов уникальны, то они выведутся по порядку.
Имя: Рыжик, длина хвоста: 3
Имя: Барсик, длина хвоста: 5
Имя: Мурзик, длина хвоста: 7
Имя: Васька, длина хвоста: 11
Имя: Рыжик, длина хвоста: 16
Переделаем сравнение - будем сначала сравнивать имена котов. Если имена котов будут совпадать, то сравним их хвосты.
@Override
public int compareTo(@NonNull Object o) {
Cat entry = (Cat) o;
int result = mName.compareTo(entry.mName);
if (result != 0) {
return result;
}
result = mTail - entry.mTail;
if (result != 0) {
return result / Math.abs(result);
}
return 0;
}
Теперь сортировка выглядит следующим образом.
Имя: Барсик, длина хвоста: 5
Имя: Васька, длина хвоста: 11
Имя: Мурзик, длина хвоста: 7
Имя: Рыжик, длина хвоста: 3
Имя: Рыжик, длина хвоста: 16
Вы можете придумать свою логику для сортировки - от большего к меньшему или как-то ещё.