gpt4 book ai didi

java - 有一个可以动态更改顺序的 Java Comparator 可以吗?

转载 作者:搜寻专家 更新时间:2023-11-01 01:00:42 25 4
gpt4 key购买 nike

我有一组带时间戳的值,我想将其放入排序集中。

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 - 有一个可以动态更改顺序的 Java Comparator 可以吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/912436/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com