Сортировка набора объектов [дубликат]

Я соглашаюсь с первым сообщением - доступ к базе данных должен быть снят на уровень DAO, который реализует интерфейс. Затем можно протестировать логику против тупиковой реализации уровня DAO.

60
задан Knut Arne Vedaa 30 July 2009 в 12:56
поделиться

8 ответов

Реализовать интерфейс Comparator (один раз для каждого порядка сортировки) и используйте метод Collections.sort () , который принимает Comparator в качестве дополнительного параметра.

35
ответ дан 24 November 2019 в 17:42
поделиться

Вы также можете использовать BeanComparator из beanutils apache commons, например:

Collections.sort(personList, new BeanComparator("name"));
6
ответ дан 24 November 2019 в 17:42
поделиться

Метод Collections.sort можно вызвать со вторым аргументом, который является используемым компаратором. Создайте 3 компаратора и при необходимости используйте тот, который вам нужен.

Collections.sort(list , new Comparator() {
        public int compare(Object o1, Object o2) {
          ...
        }
      });
2
ответ дан 24 November 2019 в 17:42
поделиться

Collections.sort можно вызвать с помощью настраиваемого компаратора. И этот компаратор может быть реализован для сортировки в разных порядках сортировки. Вот пример (для вашей модели Person - с возрастом как целым числом):

public class FlexiblePersonComparator implements Comparator<Person> {
  public enum Order {Name, Age, Country}

  private Order sortingBy = Name;

  @Override
  public int compare(Person person1, Person person2) {
    switch(sortingBy) {
      case Name: return person1.name.compareTo(person2.name);
      case Age: return person1.age.compareTo(person2.age);
      case Country: return person1.country.compareTo(person2.country);
    }
    throw new RuntimeException("Practically unreachable code, can't be thrown");
  }

  public void setSortingBy(Order sortBy) {
    this.sortingBy = sortingBy;
  }
}

И вы используете это так (при условии, что люди - это поле):

public void sortPersonsBy(FlexiblePersonComparator.Order sortingBy) {
  List<Person> persons = this.persons;  // useless line, just for clarification
  FlexiblePersonComparator comparator = new FlexiblePersonComparator();
  comparator.setSortingBy(sortingBy);
  Collections.sort(persons, comparator); // now we have a sorted list
}
48
ответ дан 24 November 2019 в 17:42
поделиться

Спасибо респондентам. Для других я хотел бы включить полный пример.

Решением является создание следующих дополнительных классов:

public class NameComparator implements Comparator<Person>
{
    public int compare(Person o1, Person o2)
    {
       return o1.getName().compareTo(o2.getName());
   }
}

public class AgeComparator implements Comparator<Person>
{
    public int compare(Person o1, Person o2)
    {
        return o1.getAge().compareTo(o2.getAge());
    }
}

public class CountryComparator implements Comparator<Person>
{
    public int compare(Person o1, Person o2)
    {
        return o1.getCountry().compareTo(o2.getCountry());
    }
}

Список можно отсортировать следующим образом:

Collections.sort(personList, new NameComparator());
Collections.sort(personList, new AgeComparator());
Collections.sort(personList, new CountryComparator());
17
ответ дан 24 November 2019 в 17:42
поделиться

Реализуйте 3 различных типа компаратора.

вы можете добавить компаратор к команде сортировки. Определенный вами компаратор будет сортировать элементы по имени, возрасту или чему-то еще.

Collections.sort(list, new Comparator() {

        public int compare(Object arg0, Object arg1) {
            if (!(arg0 instanceof Person)) {
                return -1;
            }
            if (!(arg1 instanceof Person)) {
                return -1;
            }

            Person pers0 = (Person)arg0;
            Person pers1 = (Person)arg1;


            // COMPARE NOW WHAT YOU WANT
            // Thanks to Steve Kuo for your comment!
            return pers0.getAge() - pers1.getAge();
        }
    });
3
ответ дан 24 November 2019 в 17:42
поделиться

Я задал очень похожий вопрос (о поиске, а не сортировке), возможно, есть полезная информация (в итоге я использовал перечисление , которое реализует Comparator , поэтому я передаю значение enum в качестве селектора компаратора).

0
ответ дан 24 November 2019 в 17:42
поделиться

Используя lambdaj ( http://code.google.com/p/lambdaj/ ), вы можете добиться того, о чем просите, следующим образом:

sort (personList, on (Person.class) .getName ());

sort (personList, on (Person.class) .getAge ());

sort (personList, on (Person.class) .getCountry ());

0
ответ дан 24 November 2019 в 17:42
поделиться
Другие вопросы по тегам:

Похожие вопросы: