Vin*_*nie 4 java collections comparator
我有一组带时间戳的值,我想放在一个有序的集合中.
public class TimedValue {
public Date time;
public double value;
public TimedValue(Date time, double value) {
this.time = time;
this.value = value;
}
}
Run Code Online (Sandbox Code Playgroud)
用于对此集合进行排序的业务逻辑表示,值必须按降序排序,除非它比最新值早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));
Run Code Online (Sandbox Code Playgroud)
如您所见,最初第一个值比第二个值更相关,但是一旦将最终值添加到集合中,第一个值已过期且应该是最不相关的.
我的初步测试表明这应该有效...... TreeSet会在添加更多值时动态重新排序整个列表.
但即使我看到它,我也不确定我是否相信它.
在添加每个元素时,排序的集合是否会重新排序整个集合?以这种方式(即性能)使用排序集合是否有任何问题?在添加所有值后手动对列表进行排序会更好(我猜它会是这样)?
后续行动:
尽可能多(甚至在某种程度上)怀疑,已排序的集合不支持这种"动态重新排序"的方式.我相信我的初步测试是"偶然"工作.随着我在集合中添加更多元素,"订单"迅速崩溃.感谢所有出色的回复,我重构了我的代码以使用许多人建议的方法.
Jon*_*eet 10
我没有看到你的比较器甚至可以检测到这种变化,除非它记得它目前看到的最新值 - 这听起来像一种必然会以泪水结束的方法.
我建议你按照以下几点做一些事情: