2013-09-25 3 views
1

Я хочу, чтобы мой список будет отсортирован на основе Date переменных, так что я должен написать эту логикуJava ArrayList Дата переменная Сортировка?

public static void main(String a[]){ 
     AuditLogComponent comp = new AuditLogComponent(); 
     List<TableRecord> records = new ArrayList<TableRecord>(); 
     LogFolderRecord log = new LogFolderRecord(); 
     Date date = new Date(); 
     Timestamp fromTS1 = new Timestamp(date.getTime()); 
     log.setStampDate(fromTS1); 
     records.add(log); 
     Date date1 = new Date(); 
     Timestamp fromTS2 = new Timestamp(date1.getTime()); 
     LogFolderRecord log1 = new LogFolderRecord(); 
     log1.setStampDate(fromTS2); 
     records.add(log1); 
     records.add(new LogPeopleRecord()); 

     comp.columnsList(records); 
    } 

И как я звоню метод сортировки списка

public void columnsList(List<TableRecord> records){ 

      Collections.sort(records, new StampDateComparator()); 
     for(TableRecord record : records){ 
      Table table = record.getTable(); 
      Field[] fields = table.fields(); 
      for(Field field : fields){ 
       field.getName(); 
       record.getValue(field); 

      } 
     } 

    } 

И мой класс компаратора

public class StampDateComparator implements Comparator<Object> { 

    @Override 
    public int compare(Object object1, Object object2) { 

     try { 
      Method method = object1.getClass().getDeclaredMethod("getStampDate"); 
      Date value = (Date) method.invoke(object1); 

      Method method1 = object1.getClass().getDeclaredMethod("getStampDate"); 
      Date value1 = (Date) method.invoke(object2); 

      if(value != null && value1 != null) 
      return value.compareTo(value1);; 
     } catch (SecurityException e) { 
      throw new RuntimeException(e); 
     } catch (IllegalAccessException e) { 
      e.printStackTrace(); 
     } catch (IllegalArgumentException e) { 
      e.printStackTrace(); 
     } catch (InvocationTargetException e) { 
      e.printStackTrace(); 
     } catch (NoSuchMethodException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
     return 0; 

    } 

Но это не бросает исключение,

java.lang.IllegalArgumentException: object is not an instance of declaring class 
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
    at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source) 
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source) 
    at java.lang.reflect.Method.invoke(Unknown Source) 
    at com.csdcsystems.amanda.comp.macro.StampDateComparator.compare(StampDateComparator.java:22) 
    at java.util.TimSort.countRunAndMakeAscending(Unknown Source) 
    at java.util.TimSort.sort(Unknown Source) 

Что такое точный способ сортировки по дате?

+0

вам нужно реализовать 'компаратор ' и 'не object' –

+0

принять помощь от этого. http://www.thejavageek.com/2013/06/17/sorting-user-defined-objects-part-2/ –

+0

Зачем использовать отражение? Почему бы просто не использовать дженерики, поскольку они предположительно должны быть или отнесены к соответствующему типу (после проверки)? – MadProgrammer

ответ

2

Ваш Comparator класс должен выглядеть

public class StampDateComparator implements Comparator<TableRecord> { 

    @Override 
    public int compare(TableRecord record1, TableRecord record2) { 
     return record1.getStampDate().compareTo(record2.getStampDate()); 
    } 
} 

EDIT: Даже если TableRecord является интерфейсом, вы можете использовать его в Compartor, вся ваша реализация TableRecord должен иметь метод getStampDate правильно реализован.

+0

Tablerecord Не содержит StamDate его интерфейса –

+0

, тогда вам нужно пересмотреть свой дизайн, а затем понять, почему вы не хотели бы иметь 'getStampDate' в вашем интерфейсе' TableRecord'. Поскольку нет смысла размещать некоторые случайные объекты в ваших интерфейсах Table List Recorder –

+0

, заданных JOOQ API, это не мой класс, а его неслучайный объект реализует класс TableRecord –

0

В классе Comparator, сначала вам необходимо получить Timestamp от TableRecord класс. Timestamp имеет compareTo сортимент. Дизайн вашего StampDateComparator класса как:

public class StampDateComparator implements Comparator<TableRecord> { 

    @Override 
    public int compare(TableRecord record1, TableRecord record2) { 
     Timestamp timestamp1=record1.getStampDate();   
     Timestamp timestamp2=record2.getStampDate(); 
     return timestamp1.compareTo(timestamp2); 
    } 
} 
0

метод подпись getDeclaredMethod и invoke ошибается:

Method method = object1.getClass().getDeclaredMethod("getStampDate", null); 
Date value = (Date) method.invoke(object1, null); 

Method method1 = object2.getClass().getDeclaredMethod("getStampDate", null); 
Date value1 = (Date) method.invoke(object2, null); 

Они требуют параметров для метода. См JavaDoc:

+0

. Если это неверно, это должно дать мне исключение во время компиляции –

+0

Какой jdk вы используете? –

+0

Я использую JDK7 –

Смежные вопросы