Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Comparator


Автор: JustTipCs 16.2.2014, 19:40
Добрый день. Есть задачка. Есть класс А, в котором описываются животные и два его наследника В (львы) и С (пантеры). У класса А есть абстрактный метод который рассчитывает, сколько съедает каждое животное (этот метод переопределяется в классах В и С ).  
В этой задаче нужно упорядочить животных по убыванию количества съеденного ими мяса, а при совпадении этого количества упорядочить этих животных по алфавиту. В конце нужно вывести идентификатор животного, его имя и кол-во съеденного им мяса.
 Для этого я использую массив, который затем помещаю в TreeMap, но проблема в том, что при сравнении кол-ва мяса я реализую интерфейс Comparator и проблема заключается в том, что в методе compare сравниваются объекты одного типа, а я вынужден сравнивать объект класса В и объект класса С (класс А абстрактный, т.к. он содержит абстрактный метод). Подскажите пожалуйста, выход из ситуации. 

Автор: cube 16.2.2014, 22:13
А зачем вам вообще TreeMap? почему не TreeSet? в их работе разницы никакой нет, оба деревья, только мар использует key/value. Но это без разницы если честно.

Код

public abstract class A implements Comparable<A>
.......................

public abstract int getMeat(); //сколько съедает
.......................
@Override
public int compareTo(A a)
{
            int value = a.getMeat()-this.getMeat(); // по убыванию количества съеденного (поменяете местами получите по возрастанию)
            if (value==0) return this.name.compareTo(a.getName()); // если количество одинаковое сортируете по именам
            return value; 
}



все остальное у вас наверно есть

Код

TreeSet<A> animals = new TreeSet();
animals.add(...);
animals.add(...);
....................

Iterator<A> i = animals.iterator();
while(i.hasNext())
{
           A a = i.next(); // в сортированном виде 
}


С Comparator и List должно быть что-то такое))

Код


public static Comparator<A> myComparator = new Comparator<A>() {
             @Override
        public int compare(A a1, A a2) {
                int value = a2.getMeat()-a1.getMeat();
                if (value==0) return a1.getName().compareTo(a2.getName());
                return value;
        }
 };

ArrayList<A> animals....
animals.add(....);
animals.add(....);

Collections.sort(list, myComparator);
 for(A a:list) a.........// в сортированном виде


Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)