使用具有多个条件的比较器对列表进行排序。先进先出

时间:2019-06-06 10:58:20

标签: java list sorting collections

我在排序列表时遇到问题,我完成了给定练习中的所有任务,但是这对我来说没有任何意义,我想修复它。因此,我有一个名单,例如正在排队等候药房的人。怀孕的人应该优先于所有人,其次是60岁以上的人。一切正常,除了最先出现的年龄大于60岁的人落后于后来的年龄大于60岁的人(我只需要它与FIFO规则一起工作,并按预期的标准工作即可)。 / p>

我首先使用ElasticSearchTemplate方法对列表进行排序,然后使用我创建的外部比较器类对列表进行排序。

mongoTemplate.updateMulti(Query,Update,Class)
private UpdateQuery updateExistingDocument(String Id) {
    // Add updatedDateTime, CreatedDateTime, CreateBy, UpdatedBy field in existing documents in Elastic Search Engine
    UpdateRequest updateRequest = new UpdateRequest().doc("UpdatedDateTime", new Date(), "CreatedDateTime", new Date(), "CreatedBy", "admin", "UpdatedBy", "admin");

    // Create updateQuery
    UpdateQuery updateQuery = new UpdateQueryBuilder().withId(Id).withClass(ElasticSearchDocument.class).build();
    updateQuery.setUpdateRequest(updateRequest);

    // Execute update
     elasticsearchTemplate.update(updateQuery);
}
compareTo()

结果:

public class Main {
    public static void main(String[] args) {

        List<Customer> pharmacyQueue = new ArrayList<>();
        CustomerComparator customerComparator = new CustomerComparator();

        pharmacyQueue.add(new Customer(25, false, "Przemek"));
        pharmacyQueue.add(new Customer(35, true, "Anita"));
        pharmacyQueue.add(new Customer(55, false, "Wiesława"));
        pharmacyQueue.add(new Customer(25, true, "Maryja"));
        pharmacyQueue.add(new Customer(85, false, "Halinka"));
        pharmacyQueue.add(new Customer(55, false, "Stasia"));
        pharmacyQueue.add(new Customer(20, true, "Marta"));
        pharmacyQueue.add(new Customer(65, false, "Bożenka"));
        pharmacyQueue.add(new Customer(75, false, "Paoasdo"));

        Collections.sort(pharmacyQueue); 
        Collections.sort(pharmacyQueue, customerComparator);

        System.out.println("Sorted queue: ");
        for (Customer c : pharmacyQueue){
            System.out.println(c);
        }

    }
}

2 个答案:

答案 0 :(得分:2)

为此,您基本上需要两件事:

  1. 一种stable sort algorithm,即一种不会干扰“相等”(按排序顺序)元素顺序的算法
  2. 一个比较器,可以正确识别哪些元素是“相等的”
    • 这就是您的两个比较器都失败的地方-年龄比较器甚至不使用有关另一个对象的信息(!!!),并且怀孕比较器存在一个错误,该错误认为两个怀孕的客户具有不同的优先级。 li>

答案 1 :(得分:0)

正如注释中指出的那样,对列表进行两次排序与仅使用第二次排序(只是速度较慢)相同。哦,诸如QuickSort之类的许多种类都是不稳定的(重新排列绑定值),而诸如MergeSort之类的其他种类都是稳定的。

您要组合比较器(或比较器和可比较的)。幸运的是(从1.8开始),使用java.util.Comparator

中的这两种方法确实很容易
static <T extends Comparable<? super T>> Comparator<T> naturalOrder()

default Comparator<T> thenComparing​(Comparator<? super T> other)

找到正确的方法作为练习。