【发布时间】:2010-10-29 02:03:51
【问题描述】:
我有一组带时间戳的值,我想将它们放入一个排序集中。
public class TimedValue {
public Date time;
public double value;
public TimedValue(Date time, double value) {
this.time = time;
this.value = value;
}
}
对这个集合进行排序的业务逻辑表明,值必须按值降序排列,除非它比最新值早 7 天以上。
所以作为测试,我想出了以下代码...
DateFormat dateFormatter = new SimpleDateFormat("MM/dd/yyyy");
TreeSet<TimedValue> mySet = new TreeSet<TimedValue>(new DateAwareComparator());
mySet.add(new TimedValue(dateFormatter.parse("01/01/2009"), 4.0 )); // too old
mySet.add(new TimedValue(dateFormatter.parse("01/03/2009"), 3.0)); // Most relevant
mySet.add(new TimedValue(dateFormatter.parse("01/09/2009"), 2.0));
如您所见,最初第一个值比第二个值更相关,但一旦将最终值添加到集合中,第一个值已过期并且应该是最不相关的。
我最初的测试表明这应该可以工作......随着更多值的添加,TreeSet 将动态地重新排序整个列表。
但即使我看到了,我也不确定我是否相信。
排序后的集合是否会在添加每个元素时重新排序整个集合?以这种方式使用排序集合是否有任何问题(即性能)?在添加所有值之后手动对列表进行排序会更好吗(我猜会是这样)?
跟进:
正如许多人(甚至在某种程度上我)所怀疑的那样,已排序的集合不支持这种“动态重新排序”方式。我相信我最初的测试是偶然的。当我向集合中添加更多元素时,“顺序”很快就崩溃了。感谢所有出色的回复,我重构了我的代码以使用你们许多人建议的方法。
【问题讨论】:
标签: java collections comparator