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


Автор: newsTester 3.4.2008, 01:07
проблема не в том что я сортировок не знаю, а в том что лудшее враг хорошего...
И так, ЕСТЬ у меня объект типа List элементами которого являються элементы типа Item (по 10 - 100 шт.) у которых в, свою очередь, есть есть поля типа Date.
НАДО 1)объединить несколько (до 50) таких списков; 2) выбирать из них объекты Item в строгом соответствии со значениями поля типа Date (с точностью до минуты).
была ИДЕЯ сделать List в котором элементы соответствуют Годам и содержат многомерные массивы вида Месяц Х Число Х Час Х Минута элементы которого например тотже List.
ПРОБЛЕМА в том что работа с методами Date.getYear() и т.п. считается устаревшей... Да и вообще что вы об этом думаете?

Автор: niasilil 3.4.2008, 02:01
Collections.sort(List list, Comparator c) 
напиши свой компаратор, три строчки. 
ЗЫ date сравнивать через методы Calendar 

Автор: newsTester 3.4.2008, 12:03
Цитата

напиши свой компаратор, три строчки.


а что такое "компаратор"? Я им не разу не пользовалась... Верней может и пользовалась но не знаю что это так называется.

Цитата

date сравнивать через методы Calendar 


Ну да, если делать так как я думала то только так, но можно еще как минимум через методы after и before... Может так лучше буде?

Автор: mbasil 3.4.2008, 12:21
Код

import java.util.*;
  public class DateComp implements Comparator {
    public int compare( Object o1, Object o2 ) {
       long dt1 = ((MyObject)o1).getDate().getTime();
       long dt2 = ((MyObject)o2).getDate().getTime();
       if ( dt1 == dt2 )         return 0;
       else if ( dt1 < dt2 )    return -1;
       else                           return 1;
  }
}

import java.util.*;
  public class ComparatorTest {
   public static void main(String[] args) {
    Comparator c = new DateComp();
    TreeSet set = new TreeSet(c);
    set.add(new MyObject());
    set.add(new MyObject());
    set.add(new MyObject());
    set.add(new MyObject());
 }
}

Если вам нужна реализация именно интерфейса List, то придется видимо писать свой класс, унаследовав его, например, от ArrayList, а уже в нем обеспечивать упорядоченное хранение, так как классы, реализующие  интерфейс List, сколько я помню, не поддерживают напрямую хранения в отсортированном порядке.

Автор: iluvatar 3.4.2008, 13:13
улыбнуло. давно не слышал про ручную сортировку на Java.
еще одна подсказака для сортировки классов - если постоянно требуется упорядочивать классы по одному и тому же правилу, чтобы каждый раз не писать Comparator, класс может реализовывать интерфейс Comparable

Автор: niasilil 3.4.2008, 19:51
mbasil, кстати да, getTime() действительно проще

TreeSet все таки не List

Автор: newsTester 4.4.2008, 01:47
mbasil
спасибо, что разъяснили это непонитное слово "компоратор"  smile  не знала что для таких вещей есть специальные названия..
Цитата

классы, реализующие  интерфейс List, сколько я помню, не поддерживают напрямую хранения в отсортированном порядке

как они хранят честно говоря не знаю, но там есть методы get(int index), set(int index, Object element), add(int index, Object element) и remove(int index), так что можно думать что элементы отсортированы.

iluvatar
Цитата

улыбнуло. давно не слышал про ручную сортировку на Java.

может вы и правы... но всеравно интересно
Цитата

чтобы каждый раз не писать Comparator, класс может реализовывать интерфейс Comparable

спасибо за наводку

З.Ы.
niasilil, iluvatar, mbasil, может я не умею разговаривать с людьми, поэтаму отдельно говорю что благодарна вам за помощь  smile   smile 

Автор: math64 4.4.2008, 07:42
TreeSet и List - коллекции
Код

    List list;
    ...
    Comparator c = new DateComp();
    TreeSet set = new TreeSet(c);
    set.addAll(list);
    List sortedList = new LinkedList();
    sortedList.addAll(set);

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