根据比较器使用字符串日期排序?
Sort using String Date depending on the Comparator?
我有以下 class:
public class Book implements Cloneable {
private int ISBN;
private String title;
private String publishDate;
private int pageCount;
}
我可以使用以下代码根据 Comparator
进行排序:
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);
}
但是当发布日期格式为“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);
}
};
如果您确定不能选择使用 Date 而不是 String,请使用此比较器(您可以添加一些缓存以避免每次都解析字符串):
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));
}
}
我认为你的 publishDate
应该是一个 java.util.Date
对象,如果你正在使用 Java7 或者尝试新的 Java 8 日期 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);
}
我有以下 class:
public class Book implements Cloneable {
private int ISBN;
private String title;
private String publishDate;
private int pageCount;
}
我可以使用以下代码根据 Comparator
进行排序:
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);
}
但是当发布日期格式为“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);
}
};
如果您确定不能选择使用 Date 而不是 String,请使用此比较器(您可以添加一些缓存以避免每次都解析字符串):
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));
}
}
我认为你的 publishDate
应该是一个 java.util.Date
对象,如果你正在使用 Java7 或者尝试新的 Java 8 日期 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);
}