我有一组带时间戳的值,我想将它们放在一个排序集中。
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 将动态地重新排序整个列表。
但即使我看到它,我也不确定我是否相信它。
添加每个元素时,排序集合是否会重新排序整个集合?以这种方式使用排序集合是否有任何问题(即性能)?在添加所有值之后手动对列表进行排序会更好吗(我猜会是这样)?
追问:
正如很多人(甚至在某种程度上我)怀疑的那样,排序的集合不支持这种“动态重新排序”的方式。我相信我最初的测试是偶然的。当我向集合中添加更多元素时,“顺序”很快就崩溃了。感谢所有伟大的回应,我重构了我的代码以使用你们许多人建议的方法。