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