使用SS :: MM :: HH MM / DD / YY /格式按日期对对象的arraylist进行排序

时间:2010-02-12 08:21:38

标签: java date time arraylist

我有一个对象的arraylist,每个对象包含一个以下格式的唯一日期

YEAR-DAY-MONTH HOUR:MINUTE:SECOND (example: 2010-02-10 23:32:14)

我正在尝试将数组列表中的每个对象(有几千个)与我创建的递增计时器类进行比较,以检查两个时间是否匹配。看起来最简单的方法是检查对象和计时器是否具有匹配的日期,首先将数组列表从最早到最晚排序,然后检查每个对象的个体,一旦匹配,就进入列表中的下一个对象。计时器。但是,我不确定如何根据前面提到的时间格式对数组列表进行排序。到目前为止,我的日期对象具有以下属性:

public float min;
public float hour;
public float day;
public float month;
public float year;

我如何对这些对象的数组列表进行排序,以便从最早的日期到最晚的日期进行排序?

3 个答案:

答案 0 :(得分:6)

1 - 为您的对象创建Comparator

2 - 然后,在这些对象的列表上使用Collections.sort

答案 1 :(得分:4)

潜在的简单解决方案

在我看来,你在这里重新发明轮子。有很多类型代表日期和时间 - 创建自己的类型可能会导致痛苦。 在这种情况下,我建议您使用LocalDateTime中的Joda Time

回答实际问题

你提到一个“格式”就好像我们真的在处理字符串一样 - 但我看不到有关字符串的任何内容。

为什么使用float值?这些似乎是自然整数 - 尽管你也需要几秒钟。

您可以非常轻松自然地制作类型工具Comparable<T> - 然后您只需要调用Collections.sort它就会做正确的事情。以下是Comparable<Foo>的示例实现,假设您的类型名为Foo

public int compareTo(Foo other)
{
    if (other == null)
    {
        throw new NullPointerException();
    }
    if (year < other.year)
    {
        return -1;
    }
    if (year > other.year)
    {
        return 1;
    }
    if (month < other.month)
    {
        return -1;
    }
    if (month > other.month)
    {
        return 1;
    }
    // etc
    // If we haven't returned after comparing everything
    // then the values must be equal
    return 0;
}

chburd的实施Comparer<T>的答案同样有效;如果你的对象只是一个日期/时间,那么你有一个自然的排序顺序,Comparable<T>可能是一个更好的选择;如果你在对象中确实有更多属性,而你可能希望按这些属性排序,那么Comparer<T>会更好。

答案 2 :(得分:0)

这可能是一个太简单的答案,但为什么不把这些值放到TreeMap中呢?

    TreeMap<Date, Date> sortedMap = new TreeMap<Date, Date>();
    List<Date> listOfObjectsToSort = new ArrayList<Date>();
    for (Date theDate : listOfObjectsToSort)
    {
      sortedMap.put(theDate.getTime(), theDate);
    }
    List<Date> sotedList = (List<Date>) sortedMap.values();

树形图可以在很长一段时间内排序。

我知道创建列表地图的成本更高,当你可以在arraylist上有一个Comparator时。

(现在去喝咖啡然后再读一遍)