Освой программирование играючи

Сайт Александра Климова

Шкодим

/* Моя кошка замечательно разбирается в программировании. Стоит мне объяснить проблему ей - и все становится ясно. */
John Robbins, Debugging Applications, Microsoft Press, 2000

Интерфейс Comparable

Если объекты классов нужно упорядочивать, то применяйте к ним интерфейс 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

Вы можете придумать свою логику для сортировки - от большего к меньшему или как-то ещё.

Реклама