3

以下のコードを使用して、日付/時刻 (最新のものから順に) で日付オブジェクトを注文しようとしています。順序が正しくありません。compareTo必要なソートを実現するには、メソッドを別の方法で実装する必要があると思いますか?

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;


public class DateSorter {

    public static void main(String args[]){

        List<DateObject> list = new ArrayList<DateObject>();

        DateObject d1 = new DateObject("2012-12-05" , "11:21:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-04" , "10:20:19");
        list.add(d1);

        d1 = new DateObject("2010-12-07" , "13:20:19");
        list.add(d1);

        d1 = new DateObject("2012-12-05" , "11:20:19");
        list.add(d1);

        Collections.sort(list);

        for(DateObject d : list){
            System.out.println(d);
        }
    }

}

import java.text.DateFormat;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;

public class DateObject implements Comparable<Object> {

    private String date;
    private String time;

    public DateObject(String date, String time) {
        this.date = date;
        this.time = time;
    }

    public int compareTo(Object o) {

        DateFormat formatter;
        Date date1 = null;
        Date date2 = null;
        formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        try {
            date1 = (Date) formatter.parse(this.date + " " + this.time);
            date2 = (Date) formatter.parse(this.date + " " + this.time);
        } catch (ParseException e) {
            e.printStackTrace();
        }
        catch(NullPointerException npe){
            System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
        }

         return date1.compareTo(date2);

    }

    @Override
    public String toString(){       
        return this.date+" "+this.time;
    }

}

これは表示される出力です:

2012-12-05 11:21:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-04 10:20:19
2010-12-07 13:20:19
2012-12-05 11:20:19

この出力は次のようになります。

2010-12-07 13:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:21:19
2012-12-04 10:20:19

更新:compareToメソッドを次のように変更すると:

public int compareTo(Object o) {


    DateFormat formatter;
    Date date1 = null;
    Date date2 = null;  
    DateObject other = (DateObject) o;

    formatter = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
    try {
        date1 = (Date) formatter.parse(this.date + " " + this.time);
        date2 = (Date) formatter.parse(other.date + " " + other.time);
    } catch (ParseException e) {
        e.printStackTrace();
    }
    catch(NullPointerException npe){
        System.out.println("Exception thrown "+npe.getMessage()+" date1 is "+date1+" date2 is "+date2);
    }

     return date1.compareTo(date2);

}

出力は次のとおりです。

2010-12-07 13:20:19
2012-12-04 10:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:21:19

2012-12-05 は 2012-12-04 より前に表示されるはずなので、これはまだ正しくありません

4

5 に答える 5

5

同じ日付を2回解析しています。

date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(this.date + " " + this.time);

おそらく次のようになります。

date1 = (Date) formatter.parse(this.date + " " + this.time);
DateObject other = (DateObject) o;
date2 = (Date) formatter.parse(other.date + " " + other.time);

キャストして使用する前に、oがDateObjectであり、nullではないことをテストする必要があります。

編集

を使用して更新されたコードを試してみたところ、次のreturn date2.compareTo(date1);ようになりました。

2012-12-05 11:21:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-05 11:20:19
2012-12-04 10:20:19
2010-12-07 13:20:19

これは降順です(最終日は2010年であることに注意してください)。

于 2012-12-13T16:22:37.627 に答える
0

渡されたオブジェクトではなく、日付をそれ自体と比較しています

 date1 = (Date) formatter.parse(this.date + " " + this.time);
 date2 = (Date) formatter.parse(this.date + " " + this.time);

どこでo使用されますか?

DateObjectところで、何があなたに与えますか?オブジェクトのように見えDateます。紛らわしいことに、java.util.Date日付時刻の情報を保持していることに注意してください。標準の日付オブジェクトを使用する場合は、コンパレータを作成する必要はありません。さらに良いことに、より優れた、より直感的でスレッドセーフなAPIを備えたJoda-Timeを調査することができます。

于 2012-12-13T16:23:33.233 に答える
0

次のようにする必要があります。

DateObject other = (DateObject) o;

date1 = (Date) formatter.parse(this.date + " " + this.time);
date2 = (Date) formatter.parse(other.date + " " + other.time);

date2.compareTo(date1);

最後の行に注目してください。あなたは、最新のものを最初にしたいと言っています。この場合、date1.compareTo(date2) は昇順でソートされるため、date2 と date1 を比較する必要があります。

于 2012-12-13T16:28:58.590 に答える
0

DateObject は Comparable を実装する必要があります。compareTo メソッドでは、メソッドに渡されたオブジェクトから date2 を派生させる必要があります。

于 2012-12-13T16:29:43.880 に答える
0

エラーは次のとおりです。

 date2 = (Date) formatter.parse(this.date + " " + this.time);

する必要があります

 date2 = (Date) formatter.parse(((DateObject)o).date + " " + ((DateObject)o).time);

キャストを取り除くためにこれを行うこともできます:

public class DateObject implements Comparable<DateObject> {
...
public int compareTo(DateObject o) {
    date2 = (Date) formatter.parse(o.date + " " + (o.time);
于 2012-12-13T16:24:43.093 に答える