gpt4 book ai didi

java - 是否有一种排序方法可以采用多个比较器并在元素列表的排序顺序相同的情况下使用它们?

转载 作者:搜寻专家 更新时间:2023-11-01 01:48:46 24 4
gpt4 key购买 nike

我有一份要发出的报价 list 。每个报价都有一个分数、最后日期和与之相关的报价值(value)。我希望这些优惠按优惠分数排序。使用起来很简单集合.sort(..).

现在,如果报价具有相同的分数,我想按最后日期排序。如果最后日期也相同,我想按优惠值(value)排序。

我为此编写了 datesComparator 和 ValueComparator。

然后我做了下面的,这是相当昂贵的

  1. 根据 offerScore 对 Offer 进行排序。--> 列表

  2. 从第1步中取出得分相同的offers.--> List

  3. 根据上次日期和/或要约值(value)对第 2 步中的要约进行排序。 --> 列表

  4. 将步骤 3 中的列表添加回列表中步骤 1.--> 列表

  5. 对于第 4 步,再次对报价分数使用排序,因为排序方法不会更改具有相同分数的报价的顺序。

我想知道是否有一种更简单的方法可以占用多个比较器,然后排序将占用下一个比较器,以防第一个比较器的结果对于连续报价相同!!

最佳答案

您正在寻找Comparator.thenComparing .

Returns a lexicographic-order comparator with another comparator. If this Comparator considers two elements equal, i.e. compare(a, b) == 0, other is used to determine the order.

default Comparator<T> thenComparing(Comparator<? super T> other) {
Objects.requireNonNull(other);
return (Comparator<T> & Serializable) (c1, c2) -> {
int res = compare(c1, c2);
return (res != 0) ? res : other.compare(c1, c2);
};
}

例如,

Comparator<Offer> comparator = 
Comparator.comparingInt(Offer::getOfferScore)
.thenComparing(Offer::getLastDate)
.thenComparingInt(Offer::getOfferScore);

(假设这些方法存在)

更新

Comparator<Offer> comparator =
// OfferScore -> DESC
Comparator.comparingInt(Offer::getOfferScore).reversed()
// Dates -> ASC
.thenComparing(Offer::getLastDate)
// Value -> DESC
.thenComparing(Comparator.comparingInt(Offer::getOfferScore).reversed());

关于java - 是否有一种排序方法可以采用多个比较器并在元素列表的排序顺序相同的情况下使用它们?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57604525/

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