Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Sort using String Date depending on the Comparator?

I have the following class:

public class Book implements Cloneable {
    private int ISBN;
    private String title;
    private String publishDate;
    private int pageCount;
}

I could sort depending on Comparator using the following code:

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

but how can I sort depending on the String publishDate when the publish date format is "25/12/2015"?

like image 769
Nidal Avatar asked Nov 21 '25 06:11

Nidal


1 Answers

If you are sure that using Date instead of String is not a choise, use this comparator(You can add some caching to avoid parsing strings every time):

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Comparator;

/**
 *
 * @author EBudaqov
 */
public class StringDateComparator implements Comparator<String>{

    private SimpleDateFormat formatter;

    public StringDateComparator(String dateFormat) {
        formatter = new SimpleDateFormat(dateFormat);
    }

    @Override
    public int compare(String s1, String s2) {
        try {
            return formatter.parse(s1).compareTo(formatter.parse(s2));
        } catch(ParseException exception) {
            throw new RuntimeException(exception);
        }
    }

    public static void main(String[] args) {
        String s1 = "01/01/2015";
        String s2 = "02/01/2015";

        System.out.println(new StringDateComparator("dd/MM/yyyy").compare(s1, s2));
    }

}
like image 179
Eldar Budagov Avatar answered Nov 23 '25 20:11

Eldar Budagov



Donate For Us

If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!