Java 是否有一种排序方法,在元素列表的排序顺序相同的情况下使用多个比较器?
我有一份报价单要发出去。每个报价都有一个分数、最后日期和与之相关的报价值。我希望这些报价按报价分数排序。 这是很简单的使用 Collections.sort(..) 现在,如果报价有相同的分数,我想在最后一天排序。 如果最后的日期也是相同的,我想按报价值排序 我已经为此编写了日期比较器和价值比较器 然后我做了下面这件很贵的事Java 是否有一种排序方法,在元素列表的排序顺序相同的情况下使用多个比较器?,java,collections,comparator,Java,Collections,Comparator,我有一份报价单要发出去。每个报价都有一个分数、最后日期和与之相关的报价值。我希望这些报价按报价分数排序。 这是很简单的使用 Collections.sort(..) 现在,如果报价有相同的分数,我想在最后一天排序。 如果最后的日期也是相同的,我想按报价值排序 我已经为此编写了日期比较器和价值比较器 然后我做了下面这件很贵的事 根据offerScore对报价进行排序。-->List 从步骤1中取出分数相同的报价。-->列表 根据最后日期和/或报价值对步骤2中的报价进行排序。-->名单 将步骤3中的
比较器
认为两个元素相等,即比较(a,b)==0
,其他
用于确定顺序
default Comparator然后比较(Comparator接口java.util.Comparator
具有将比较链接在一起所需的所有方法。因此,您的代码可能如下所示:
List<Offer> offers = getOffers();
offers.sort(Comparator
.comparing(Offer::getOfferScore)
.thenComparing(Offer::getOfferValue)
.thenComparing(Offer::getLastDate);
List offers=getOffers();
offers.sort(比较器
.比较(报价::getOfferScore)
.Then比较(Offer::getOfferValue)
.然后比较(报价::getLastDate);
您所描述的内容并不是由多个比较器来表示的,因为一个比较器就足以表示该逻辑。请记住比较器
只是表示一种比较两个对象的方式。它可以是任何方式,不管它有多复杂。这也是Collections.sort
不提供采用多个比较器的方法
您可以将多个比较器
组合成一个比较器
(具有更复杂的逻辑),使用(及其原始对应项)来实现您想要的:
Comparator<Offer> complicatedComparator =
Comparator.comparing(Offer::getOfferScore)
.thenComparing(Offer::getLastDate)
.thenComparing(Offer::getOfferValue);
Comparator Comparator=
Comparator.comparing(Offer::getOfferScore)
.Then比较(报价::getLastDate)
.然后比较(Offer::getOfferValue);
Comparator.ThenComparating
(和变体)。在上面的代码段中,如果我想更改其中一个比较器的排序顺序,比如lastDate,该怎么做?Collections.sort(offers,Comparator.comparingInt(Offer::getOfferScore)。ThenComparating(this::compareLastDate)。ThenComparating(this::compareValue)。reversed());
我想按以下顺序排序:OfferScore->DESC Dates->ASC Value->DESC@the_way根据我的原始答案更新(因为我不知道你的this::compareLastDate
和this::compareValue
是什么)。无论如何,你应该明白了。ToblikoCollections.sort(程序,Comparator.comparingInt((ProgramSortCriteria::getProgramScore)).reversed();
这是我当前的代码。这一行然后比较(ProgramSortCriteria::getSavingsValue)。reversed()
正在颠倒完整报价列表的顺序。如何避免这种情况?@它应该是。然后比较(Comparator.comparing(ProgramSortCriteria::getSavingsValue)。reversed());
或较窄版本的比较xxx
取决于getSavingsValue
Comparator<Offer> comparator =
// OfferScore -> DESC
Comparator.comparingInt(Offer::getOfferScore).reversed()
// Dates -> ASC
.thenComparing(Offer::getLastDate)
// Value -> DESC
.thenComparing(Comparator.comparingInt(Offer::getOfferScore).reversed());
List<Offer> offers = getOffers();
offers.sort(Comparator
.comparing(Offer::getOfferScore)
.thenComparing(Offer::getOfferValue)
.thenComparing(Offer::getLastDate);
Comparator<Offer> complicatedComparator =
Comparator.comparing(Offer::getOfferScore)
.thenComparing(Offer::getLastDate)
.thenComparing(Offer::getOfferValue);