0

私はコードの下にある問題を抱えています

public void columnsList(List<TableRecord> records){

    for(TableRecord record : records){
        Table table = record.getTable();
        //Do sort here on stampDate
        Field[] fields = table.fields();
        for(Field field : fields){
            field.getName();
            record.getValue(field);

        }
    }

}

およびrecordsオブジェクトには、異なるクラス型のオブジェクトが含まれています

List<TableRecord> records = new List<TableRecord>();
records.add(new AddressRecord());
records.add(new CityRecord());
records.add(new UserRecord());

stampDate各クラスにある変数でそれらをソートする方法

4

4 に答える 4

2

上記のコードが正しい場合、それは を意味しAddressRecord、すべて拡張します:CityRecordUserRecordTableRecord

class AddressRecord extends TableRecord {
    // other fields and methods here
}
class CityRecord extends TableRecord {
    // other fields and methods here
}
class UserRecord extends TableRecord {
    // other fields and methods here
}

Comparatorこのクラスの を書くだけです。次のようになります。

class TableRecord {
    private Date timeStamp;

    public Date getTimeStamp() {
        return timeStamp;
    }
// other fields and methods here
}

class RecordStampDateComparator implements Comparator<TableRecord>{

    public int compare(TableRecord tr1, TableRecord tr2) {
        Date tr1Date = tr1.getTimeStamp();
        Date tr2Date = tr2.getTimeStamp();   
        return tr1Date.compareTo(tr2Date);
    }
}
于 2013-09-24T06:54:14.120 に答える
1

Comparableを実装し、compareToメソッドをオーバーライドする、保護されたフィールドstampDateを持つ抽象クラスRecordを作成するだけです。

public abstract class Record implements Comparable<Record> {
    protected Date stampDate;

    @Override
    public int compareTo(Record anotherRecord){
        return this.stampDate.compareTo(anotherRecord.stampDate);
    }
}

次に、このクラスをレコード クラスで拡張します。

public class AddressRecord extends Record{
...
}

public class CityRecord extends Record{
...
}

public class UserRecord extends Record{
...
}
于 2013-09-24T06:50:41.803 に答える
1

クラスを変更できない場合は、comparator( Comparator<Object>) を記述します。これにより、フィールド stampDate が検索され、それらが比較されます。リストのソートに使用するよりも。コンパレータの実装:

import java.util.Comparator;
import java.util.Date;


public class StampDateComparator implements Comparator<Object> {

@Override
public int compare(Object o1, Object o2) {

    try {
        Date d1 = (Date) o1.getClass().getDeclaredField("stampDate").get(o1);
        Date d2 = (Date) o2.getClass().getDeclaredField("stampDate").get(o2);
        return compare(d1, d2);
    } catch (SecurityException e) {
        throw new RuntimeException(e);
    } catch (NoSuchFieldException e) {
        throw new RuntimeException("Missing variable stampDate");
    }catch (ClassCastException e) {
        throw new RuntimeException("stampDate is not a Date");
    } catch (IllegalArgumentException e) {
        //shoud not happen
        throw new RuntimeException(e);
    } catch (IllegalAccessException e) {
        throw new RuntimeException(e);
    }
}

}
于 2013-09-24T06:54:59.747 に答える
0

List で次の Comparator クラスを使用します。

class TableRecordCompare implements Comparator<TableRecord>{
     if(TableRecord instanceof AddressRecord){
       // return compareTo for sample data of address.
     }
     else if(TableRecord instanceof CityRecord){
     // return compareTo for sample data of CityRecord.
      }
     else{
     // return compareTo for sample data of UserRecord.
    }

}
于 2013-09-24T06:55:40.513 に答える