我有一个对象的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;
我如何对这些对象的数组列表进行排序,以便从最早的日期到最晚的日期进行排序?
答案 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时。
(现在去喝咖啡然后再读一遍)