Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 根据比较器使用字符串日期进行排序?_Java_Date_Comparator - Fatal编程技术网

Java 根据比较器使用字符串日期进行排序?

Java 根据比较器使用字符串日期进行排序?,java,date,comparator,Java,Date,Comparator,我有以下课程: public class Book implements Cloneable { private int ISBN; private String title; private String publishDate; private int pageCount; } 我可以使用以下代码根据比较器进行排序: Comparator<Book> titleComparator = new Comparator<Book>() {

我有以下课程:

public class Book implements Cloneable {
    private int ISBN;
    private String title;
    private String publishDate;
    private int pageCount;
}
我可以使用以下代码根据比较器进行排序:

Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return o1.title.compareTo(o2.title);
    }
};

Comparator<Book> ISBNComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return Integer.valueOf(o1.ISBN).compareTo(o2.ISBN);
    }
};

public void sort(final String field, ArrayList<Book> BookList) {
    final Comparator<Book> comparator;

    if (field.equals("title")) {
        comparator = titleComparator;
    } else if (field.equals("ISBN")) {
        comparator = ISBNComparator;
    } else {
        throw new IllegalArgumentException("Comparator not found for " + field);
    }

    Collections.sort(BookList, comparator);
}
Comparator titleComparator=新的比较器(){
@凌驾
公共整数比较(o1册、o2册){
返回o1.title.compareTo(o2.title);
}
};
比较器ISBNComparator=新比较器(){
@凌驾
公共整数比较(o1册、o2册){
返回整数值o1.ISBN.compareTo(o2.ISBN);
}
};
公共无效排序(最终字符串字段,ArrayList书目){
最终比较器;
如果(字段等于(“标题”)){
比较器=滴定比对器;
}else if(字段等于(“ISBN”)){
比较器=ISBN比较器;
}否则{
抛出新的IllegalArgumentException(“未找到“+字段的比较器”);
}
集合。排序(书目、比较器);
}

但是,当发布日期格式为“25/12/2015”时,如何根据字符串publishDate进行排序

您需要以
java.util.date()
格式解析日期,然后进行比较。请尝试以下示例代码:

Comparator<Book> dateComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        SimpleDateFormat formatter = new SimpleDateFormat("dd/MM/yyyy");
        Date o1PublishDate = null;
        Date o2PublishDate = null;
        try {
            o1PublishDate = formatter.parse(o1.publishDate);
            o2PublishDate = formatter.parse(o2.publishDate);
        } catch (ParseException pe) {
            pe.printStackTrace();
        }

        return o1PublishDate.compareTo(o2PublishDate);

    }
};
Comparator dateComparator=new Comparator(){
@凌驾
公共整数比较(o1册、o2册){
SimpleDataFormat格式化程序=新的SimpleDataFormat(“dd/MM/yyyy”);
日期o1PublishDate=null;
日期o2PublishDate=null;
试一试{
o1PublishDate=格式化程序.parse(o1.publishDate);
o2PublishDate=格式化程序.parse(o2.publishDate);
}捕获(解析异常pe){
pe.printStackTrace();
}
返回o1PublishDate.compareTo(o2PublishDate);
}
};

如果您确定使用日期而不是字符串不是一种选择,请使用此比较器(您可以添加一些缓存以避免每次解析字符串):

import java.text.ParseException;
导入java.text.simpleDataFormat;
导入java.util.Comparator;
/**
*
*@作者埃布达科夫
*/
公共类StringDateComparator实现了Comparator{
私有SimpleDataFormat格式化程序;
公共StringDateComparator(字符串日期格式){
格式化程序=新的SimpleDataFormat(日期格式);
}
@凌驾
公共整数比较(字符串s1、字符串s2){
试一试{
返回formatter.parse(s1).compareTo(formatter.parse(s2));
}捕获(解析异常异常){
抛出新的RuntimeException(异常);
}
}
公共静态void main(字符串[]args){
字符串s1=“01/01/2015”;
字符串s2=“02/01/2015”;
System.out.println(新的StringDateComparator(“dd/MM/yyyy”).compare(s1,s2));
}
}

如果您使用的是Java7,我认为您的
publishDate
应该是
java.util.Date
对象,或者如果可以,尝试使用新的Java8日期API。但是,代码应如下所示:

Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return o1.title.compareTo(o2.title);
    }
};
Comparator<Book> ISBNComparator = new Comparator<Book>() {

    @Override
    public int compare(Book o1, Book o2) {
        return Integer.valueOf(o1.ISBN).compareTo(o2.ISBN);
    }
};
Comparator<Book> PublishComparator = new Comparator<Book>() {

    DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    @Override
    public int compare(Book o1, Book o2) {
        Date d1 = format.parse(o1.publishDate);
        Date d2 = format.parse(o2.publishDate);

        return d1.compareTo(d2);
    }
};
public void sort(final String field, ArrayList<Book> BookList) {

    final Comparator<Book> comparator;

    if (field.equals("title")) {
        comparator = titleComparator;
    } else if (field.equals("ISBN")) {
        comparator = ISBNComparator;
    } else if (field.equals("publishDate")) {
        comparator = PublishComparator;
    } else {
        throw new IllegalArgumentException("Comparator not found for " + field);
    }
    Collections.sort(BookList, comparator);
}
Comparator titleComparator=新的比较器(){
@凌驾
公共整数比较(o1册、o2册){
返回o1.title.compareTo(o2.title);
}
};
比较器ISBNComparator=新比较器(){
@凌驾
公共整数比较(o1册、o2册){
返回整数值o1.ISBN.compareTo(o2.ISBN);
}
};
比较器PublishComparator=新比较器(){
DateFormat格式=新的SimpleDateFormat(“dd/MM/yyyy”);
@凌驾
公共整数比较(o1册、o2册){
Date d1=format.parse(o1.publishDate);
Date d2=format.parse(o2.publishDate);
返回d1。比较(d2);
}
};
公共无效排序(最终字符串字段,ArrayList书目){
最终比较器;
如果(字段等于(“标题”)){
比较器=滴定比对器;
}else if(字段等于(“ISBN”)){
比较器=ISBN比较器;
}else if(字段等于(“publishDate”)){
比较器=出版比较器;
}否则{
抛出新的IllegalArgumentException(“未找到“+字段的比较器”);
}
集合。排序(书目、比较器);
}

我可以建议您从更合适的类型开始吗?理想情况下,Java8的
LocalDate
type。。。你试图代表一个日期。。。那么为什么要使用字符串呢?您需要以
java.util.date()
格式解析日期,然后进行比较。使用纯字符串值是不正确的。这就是为什么日期不应该是字符串的一个很好的例子
Comparator<Book> titleComparator = new Comparator<Book>() {
    @Override
    public int compare(Book o1, Book o2) {
        return o1.title.compareTo(o2.title);
    }
};
Comparator<Book> ISBNComparator = new Comparator<Book>() {

    @Override
    public int compare(Book o1, Book o2) {
        return Integer.valueOf(o1.ISBN).compareTo(o2.ISBN);
    }
};
Comparator<Book> PublishComparator = new Comparator<Book>() {

    DateFormat format = new SimpleDateFormat("dd/MM/yyyy");
    @Override
    public int compare(Book o1, Book o2) {
        Date d1 = format.parse(o1.publishDate);
        Date d2 = format.parse(o2.publishDate);

        return d1.compareTo(d2);
    }
};
public void sort(final String field, ArrayList<Book> BookList) {

    final Comparator<Book> comparator;

    if (field.equals("title")) {
        comparator = titleComparator;
    } else if (field.equals("ISBN")) {
        comparator = ISBNComparator;
    } else if (field.equals("publishDate")) {
        comparator = PublishComparator;
    } else {
        throw new IllegalArgumentException("Comparator not found for " + field);
    }
    Collections.sort(BookList, comparator);
}