拥有可以动态更改订单的Java Comparator是否可以?

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

我没有看到你的比较器甚至可以检测到这种变化,除非它记得它目前看到的最新值 - 这听起来像一种必然会以泪水结束的方法.

我建议你按照以下几点做一些事情:

  • 在无序集(或列表)中收集数据
  • 找到最新的价值
  • 基于该值创建比较器,以便使用该比较器的所有比较都是固定的(即它将永远不会返回基于相同输入值的不同结果;比较器本身是不可变的,尽管它取决于构造函数中最初提供的值)
  • 使用该比较器创建一个已排序的集合(以任何方式看起来最好,取决于您当时想要用它做什么)