Сортировка ArrayList - PullRequest
       11

Сортировка ArrayList

2 голосов
/ 15 марта 2011

У меня есть один список массивов

ArrayList itemListWithRank = ItemListDAO.getItemList();

и в массиве списков itemListWithRank есть много типов значений объектов, которые все различны.И одно из них - это ранг предмета, который также устанавливается с этим списком массивов.

Теперь я хочу отсортировать этот список массивов на основе возрастающего порядка рангов.Значение ранга уже установлено в этом списке массива.

Как я могу отсортировать массив, у которого есть много типов значений ....?

Спасибо всем ....

Ответы [ 5 ]

6 голосов
/ 15 марта 2011

Сделайте их объектами типа. либо разработайте общий базовый класс, либо Interface

, а затем

используйте Comparator, чтобы отсортировать их

Например.

public class SortableFields{
  protected long rank;
  //accessors methods
}

предположил, что все объекты в массиве теперь являются SortableFields

Теперь

Collections.sort(list,new Comparator(){
public int compareTo(Object ob1,Object ob){
  return ((SortableFild)ob1.getRank())-((SortableFild)ob2.getRank())
}
});

Или использовать взломать отражение, не желательно

Collections.sort(list,new Comparator(){
public int compareTo(Object ob1,Object ob){
     UtilClass.getRank(ob1)-UtilClass.getRank(ob);      
}
});

В вашем UtilClass

public int getRank(Object ob){

      Class cl=ob1.getClass();
      Method mthd=cl.getMethod("getRank");
      Integer output=(Integer)mthd1.invoke(ob);
      return output;

}
4 голосов
/ 15 марта 2011

Используйте 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 для реализации общего интерфейса.

2 голосов
/ 15 марта 2011
Collections.sort(itemListWithRank ,new Comparator<Person>() {

    public int compare(Person o1, Person o2) {
        return Integer.valueOf(o1.id).compareTo(Integer.valueOf(o2.id));
    }
});
1 голос
/ 15 марта 2011

Рассмотрите возможность использования lambdaj , которая позволяет эту конструкцию

List<Person> sorted = sort(persons, on(Person.class).getAge());
0 голосов
/ 15 марта 2011

Прежде всего, каждый объект в ArrayList должен иметь некоторый общий родительский элемент в своей иерархии или реализовывать интерфейс, который определяет какой-либо способ получения ранга.Например, все они должны реализовать этот интерфейс:

interface Rankable {
    public int getRank();
}

Вы можете создать собственный Компаратор :

Comparator<Rankable> myComparator = new Comparator<Rankable>() {
    public int compare(Rankable o1, Rankable o2) {
        return o1.getRank() - o2.getRank();
    }
    public equals(Object obj) {
        return obj == this;
    }
}

И, наконец, отсортировать свой ArrayList:

Collections.sort(itemListWithRank, myComparator);

Вы также можете реализовать Comparable во всех ваших объектах в ArrayList, а затем унаследованный метод сортировки, но это будет менее гибким, если вы планируете сравнивать их другим способом..

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...