Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/380.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 是否有一种排序方法,在元素列表的排序顺序相同的情况下使用多个比较器?_Java_Collections_Comparator - Fatal编程技术网

Java 是否有一种排序方法,在元素列表的排序顺序相同的情况下使用多个比较器?

Java 是否有一种排序方法,在元素列表的排序顺序相同的情况下使用多个比较器?,java,collections,comparator,Java,Collections,Comparator,我有一份报价单要发出去。每个报价都有一个分数、最后日期和与之相关的报价值。我希望这些报价按报价分数排序。 这是很简单的使用 Collections.sort(..) 现在,如果报价有相同的分数,我想在最后一天排序。 如果最后的日期也是相同的,我想按报价值排序 我已经为此编写了日期比较器和价值比较器 然后我做了下面这件很贵的事 根据offerScore对报价进行排序。-->List 从步骤1中取出分数相同的报价。-->列表 根据最后日期和/或报价值对步骤2中的报价进行排序。-->名单 将步骤3中的

我有一份报价单要发出去。每个报价都有一个分数、最后日期和与之相关的报价值。我希望这些报价按报价分数排序。 这是很简单的使用 Collections.sort(..)

现在,如果报价有相同的分数,我想在最后一天排序。 如果最后的日期也是相同的,我想按报价值排序

我已经为此编写了日期比较器和价值比较器

然后我做了下面这件很贵的事

  • 根据offerScore对报价进行排序。-->List

  • 从步骤1中取出分数相同的报价。-->列表

  • 根据最后日期和/或报价值对步骤2中的报价进行排序。-->名单

  • 将步骤3中的列表添加回中的列表 步骤1。-->列表

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

  • 我想知道是否有一个更简单的方法,将采取多个比较器,然后排序将采取下一个比较器的情况下,第一个比较器的结果是相同的连续提供

    您正在寻找的

    返回一个字典顺序比较器和另一个比较器。如果该
    比较器
    认为两个元素相等,即
    比较(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
    是什么)。无论如何,你应该明白了。Tobliko
    Collections.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);