2010-02-12 70 views
0

我有对象的ArrayList,每个都包含在下面的格式依日期排序使用SS :: MM对象的ArrayList :: HH MM/DD/YY /格式

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

I”的唯一日期m试图比较数组列表中的每个对象(有几千个)和我创建的递增计时器类,以检查两个时间是否匹配。看起来像检查对象和计时器是否具有匹配日期的最简单方法是首先将数组列表从最早到最新排序,然后检查每个对象个体,然后检查列表中的下一个匹配计时器。但是,我不知道我将如何基于前面提到的时间格式对数组列表进行排序。到目前为止,我于对象具有以下属性:

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

如何使其从最早到最晚日期排序,我可以整理这些对象的数组列表?

回答

4

潜在简单的解决方案

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

回答实际问题

你提到一个“格式”,仿佛我们真正处理字符串 - 但我不能看到字符串有什么。

为什么使用float值?这些看起来像自然整数 - 尽管你也需要秒。

你可以很容易和自然地让你的类型实现Comparable<T> - 那么你只需要调用Collections.sort,它会做正确的事情。下面是Comparable<Foo>一个样本实现,假设你的类型被称为Foo:实施Comparer<T>代替

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的答案是同样有效;如果你的对象是只是日期/时间,那么你有一个自然的排序顺序和Comparable<T>可能是一个更好的选择;如果实际上在对象中有更多属性,并且您可能想按这些属性进行排序,那么Comparer<T>会更好。

0

这可能是一个过于简单的回答,但为什么不干脆把值放入一个TreeMap的名单上使用Collections.sort开始?

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

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

我知道创建列表地图的成本比较高,因为您可以在列表中使用比较器。

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

相关问题