Сортировка Arraylist по дате сортирует только день, а не месяц и год?
Я пытаюсь отсортировать ArrayList по (тип даты) MyObject.getDate()
Мой формат отформатирован в SimpleDateFormat dd-mm-yyyy; Я использую собственный компаратор для сортировки моего списка. Я использую Collections.sort(produuctList, новый CustomComparator())
Проблема в моем отсортированном списке только по дд, а не дд-мм-гггг.
Есть идеи?
public class Product
{
private String productName;
private Date boughtOn;
private Date useBy;
private double boughtAt;
private long quantity;
private static DateFormat dateFormat;
public Date getUseBy()
{
return useBy;
}
public void setUseBy(Date useBy)
{
this.useBy = useBy;
}
}
public static Date rtnDate(String dateStr, int currentLineCount)
{
SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");
try
{
Date date = df.parse(dateStr);
return date;
}
catch (ParseException e)
{
productParsingErrorMessages.add("Date parse exception: " + e + "on line " + currentLineCount);
return null;
}
// DateFormat formatter = new SimpleDateFormat("dd-mm-yyyy");
// Date date2 = (Date)formatter.parse(dateStr);
}
System.out.println("Product list - BEFORE sorting by UseBy"); printInventory(produuctList); Collections.sort(produuctList, new CustomComparator()); System.out.println("Product list - AFTER sorting by UseBy"); printInventory(produuctList);
public class CustomComparator implements Comparator<Product>
{
@Override
public int compare(Product o1, Product o2)
{
return o1.getUseBy().compareTo(o2.getUseBy());
}
}
Список продуктов - ДО сортировки по UseBy
Название продукта: сахар Срок годности: 12-12-2012
Название продукта: сахар Срок годности: 01-10-2012
Название продукта: сахар Срок годности: 16-04-2012
Название продукта: сахар Срок годности: 30-01-2012
Название продукта: сахар Срок годности: 25-04-2012
Название продукта: сахар Срок годности: 03-04-2012
Название продукта: сахар. Использовать: 08-04-2012
Список продуктов - ПОСЛЕ сортировки по UseBy
Название продукта: сахар Срок годности: 01-10-2012
Название продукта: сахар Срок годности: 03-04-2012
Название продукта: сахар. Использовать: 08-04-2012
Название продукта: сахар Срок годности: 12-12-2012
Название продукта: сахар Срок годности: 16-04-2012
Название продукта: сахар Срок годности: 25-04-2012
Название продукта: сахар Срок годности: 30-01-2012
2 ответа
Если ваша строка формата была скопирована правильно, ваш SimpleDateFormat неверен. Так должно быть dd-MM-yyyy
не dd-mm-yyyy
, так как вас интересуют месяцы, а не минуты.
У тебя есть:
public static Date rtnDate(String dateStr, int currentLineCount)
{
SimpleDateFormat df = new SimpleDateFormat("dd-mm-yyyy");
Когда вы должны использовать:
public static Date rtnDate(String dateStr, int currentLineCount)
{
SimpleDateFormat df = new SimpleDateFormat("dd-MM-yyyy");
Это объяснило бы все.
Я примерно на 90% уверен, что вы сравниваете java.lang.String
а не java.util.Date
s. Учитывая формат даты, который вы упомянули, он, очевидно, сначала отсортирует все дни вместе. Например, в течение всего года ваш список будет начинаться с:
01-01-2012 (1 Jan)
01-02-2012 (1 Feb)
01-03-2012 (1 Mar)
Для сравнения используйте объект Date, а не его строковое представление.
PS картинка не кодовая. Введите свой код в свой вопрос.
Обновление: доказательство того, что код, который вы разместили, работает как положено:
import java.text.DateFormat;
import java.util.*;
public class DateComparators {
public static void main(String[] args) {
List<Product> productList = Arrays.asList(
new Product(new Date(2012 - 1900, 5, 1)), // 1 Jun 2012
new Product(new Date(2012 - 1900, 1, 1)), // 1 Feb 2012
new Product(new Date(2012 - 1900, 2, 15)), // 15 Mar 2012
new Product(new Date(2012 - 1900, 0, 2)), // 2 Jan 2012
new Product(new Date(2012 - 1900, 1, 2)), // 2 Feb 2012
new Product(new Date(2012 - 1900, 0, 1)) // 1 Jan 2012
);
Collections.sort(productList, new CustomComparator());
System.out.println(productList);
}
static class CustomComparator implements Comparator<Product> {
@Override
public int compare(Product o1, Product o2) {
return o1.getUseBy().compareTo(o2.getUseBy());
}
}
static class Product {
private String productName; // sauce pan
private Date boughtOn; // 4-5-2012
private Date useBy; // 4-5-2012
private double boughtAt; // $4.05
private long quantity; // 9
private static DateFormat dateFormat;
Product(Date useBy) {
this.useBy = useBy;
}
public Date getUseBy() {
return useBy;
}
public void setUseBy(Date useBy) {
this.useBy = useBy;
}
@Override
public String toString() {
return "\nuseBy=" + useBy;
}
}
}
Выход:
[
useBy=Sun Jan 01 00:00:00 CST 2012,
useBy=Mon Jan 02 00:00:00 CST 2012,
useBy=Wed Feb 01 00:00:00 CST 2012,
useBy=Thu Feb 02 00:00:00 CST 2012,
useBy=Thu Mar 15 00:00:00 CDT 2012,
useBy=Fri Jun 01 00:00:00 CDT 2012]
Таким образом, вы не показали нам все. Проблема в том, что вы упустили.