1

リストを変数に基づいてソートしたいので、Dateこのロジックを書く必要があります

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);
    }

そして、ListのSortメソッドを呼び出す方法

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);

            }
        }

    }

そして、私の Comparator クラスは

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)

日付に基づいて並べ替えを行う正確な方法は何ですか?

4

3 に答える 3

2

クラスComparatorは次のようになります

public class StampDateComparator implements Comparator<TableRecord> {

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

編集:TableRecordがインターフェースであっても、それを で使用できますCompartor。すべての実装でTableRecordは、メソッドがgetStampDate正しく実装されている必要があります。

于 2013-09-25T09:54:44.327 に答える
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 を参照してください。

于 2013-09-25T10:11:24.830 に答える
0

クラスでは、まずクラスからComparator取得する必要があります。には、それをソートするメソッドがあります。クラスを次のように設計します。TimestampTableRecordTimestampcompareToStampDateComparator

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);
    }
}
于 2013-09-25T10:03:26.673 に答える