Используйте Collections.sort(List<T> list, Comparator<? super T> c)
и передайте пользовательский компаратор для ваших объектов DAO.
Намного проще, если все ваши элементы списка имеют общий супертип, который предоставляет метод для получения ранга элемента. Если у вас есть такой интерфейс, давайте назовем его RankProvider
, компаратор может выглядеть так:
public class Comparator<RankProvider> {
@Override
public int compare(RankProvider o1, RankProvider o2) {
return o1.getItemRank().compareTo(o2.getItemRank());
}
}
Передайте экземпляр этого компаратора или определите анонимный класс.
Примечание - в приведенном выше примере предполагается, что ранг элемента является либо Java-примитивом (например, int
), либо String, или, другими словами, является Comparable
(непосредственно или после inboxing)
Если у вас нет общего суперкласса или интерфейса, сравнение будет менее тривиальным. Вам нужно либо знать все возможные типы и обрабатывать их каждый из них, либо вы знаете , что все типы имеют один и тот же метод (имя), и вы можете отражать ранг. Один пример для компаратора, который сравнивает известные, но случайные типы:
public class Comparator { // no generics this time
@Override
public int compare(Object o1, Object o2) {
Object[] comparables = new Object{o1, o2};
int[] ranks = new int[2];
for (int i = 0; i < 2; i++) {
if (comparables[i] instanceof MyType1) {
ranks[i] = ((MyType1) comparables[i]).getRank(); // rank getter for MyType1 type
continue;
}
if (comparables[i] instanceof MyType2) {
ranks[i] = ((MyType2) comparables[i]).getRank(); // rank getter for MyType2 type
continue;
}
// ...
}
return ranks[0] - ranks[1]; // ascending order
}
}
Это можно сделать, если у вас нет возможности реорганизовать ваши DAO для реализации общего интерфейса.