首页 文章

在Java中排序自定义日期类

提问于
浏览
1

我创建了自己的日期类java,并使用toString方法输出我自己的日期格式 .

这是Date类

public class Date {
    private int day;
    private int month;
    private int year;


    public Date() {
    this.day = 0;
    this.month = 0;
    this.year = 0;
    }

    public Date(int day, int month, int year) {
        this.day = day;
        this.month = month;
        this.year = year;
    }

    public Date(Date d) {
        this.day = d.day;
        this.month = d.month;
        this.year = d.year;
    }

        @Override
    public String toString() {
        return "" +this.day+"."+this.month+"."+this.year;
    }

}

现在我必须在Main类中使用此类,并按升序对日期进行排序 . 一切似乎都很好,但netbeans给出错误说“解析不能应用于Date”但我已经在我的Date类中使用了toString方法 .

import java.text.*;
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Main {

    public static void main(String[] args) {
    ArrayList<Date> date = new ArrayList<Date>();
    Date date1 = new Date(28,7,2017);
    Date date2 = new Date(1,10,2017);
    Date date3 = new Date(15,9,2018);
    Date date4 = new Date(25,11,2018);
    Date date5 = new Date(5,6,2014);

    date.add(date1);
    date.add(date2);
    date.add(date3);
    date.add(date4);
    date.add(date5);
        sortDates(date);

        for (Date SortedDate : date) {
            System.out.println(SortedDate);
        }

    }

    private static void sortDates(ArrayList<Date> date) {
        Collections.sort(date, new Comparator<Date>() {
            DateFormat f = new SimpleDateFormat("dd/MM/yyyy");
            @Override
            public int compare(Date o1, Date o2) {
                try {
                    return f.parse(o1).compareTo(f.parse(o2));
                } catch (ParseException e) {
                    throw new IllegalArgumentException(e);
                }
            }
        });
    }
}

2 回答

  • 0

    你必须明确地调用 Data 类的 toString()

    format.parse(date.toString());
    

    但我建议实现 Comparable<T> 接口 . 看一看:

    public class Date implements Comparable<Date> {
         // fields and accessors...
    
         @Override
         public int compareTo(Date d) {
             if(year != d.year) {
                 return year < d.year ? -1 : 1;
             }
             if(month != d.month) {
                 return month < d.month ? -1 : 1;
             }
             if(day != d.day) {
                 return day < d.day ? -1 : 1;
             }
             return 0;
         }
    }
    

    现在将 Date 实例添加到列表后,只需在没有比较器的情况下调用 Collection.sort

    ArrayList<Date> list = new ArrayList<>();
    // add dates...
    Collection.sort(list);
    

    这种方法可以避免转换到 String 的开销 .

  • 0

    在o1和o2上显式调用toString并更改toString方法以生成与SimpleDateFormat相同的格式

相关问题