使用比较器按预定义的优先级顺序排序

7vux5j2d  于 2021-08-20  发布在  Java
关注(0)|答案(2)|浏览(368)

我有以下问题要解决。我正在使用java。
一家餐厅可接待三类顾客:“新手”、“常客”和“贵宾”。当客户下订单时,所有订单都加入一个队列。然而,订单的送达方式始终是贵宾先送达常客,常客先送达新手。
我需要一个类,可以用来排序的客户订单。如果两个客户属于同一类型,则应使用orderid对其进行排序。
如何使用comparator根据客户类型按订单优先级排序?
假设我已经有了下面的类顺序

public class Order
{
    public static int orderID;
    private int tableNumber;
    private String[] orderDetails;
    private String customerType;

    public Order(int tableNumber, String[] orderDetails, String customerType)
    {
        this.tableNumber = tableNumber;
        this.orderDetails = orderDetails;
        this.customerType = customerType;
        orderID += 1;
    }
    // get and set methods declared
}

我已按如下方式实施了比较器:

import java.util.Comparator;

public class OrderComparator implements Comparator<Order>
{
    @Override
    public int compare(Order o1, Order o2)
    {
        if(o1.getType().equals(o2.getType()))
            return o1.getOrderID - o2.getOrderID;
        else
        // How does comparing the customer type text ensure that 
        // it will be printed in the right order?
            return o1.getType().compareTo(o2.getType());
    }
}
xt0899hw

xt0899hw1#

不仅要对多个字段进行排序,还需要对其中一个字段进行自定义排序。
在下面的代码中,我填写了两个类中缺少的部分 Order 和阶级 OrderComparator . 代码后面的注解。

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Order {
    public static final String  NEWBIES = "NEWBIES";
    public static final String  REGULARS = "REGULARS";
    public static final String  VIP = "VIP";

    private static int  orderId;

    private int orderID;
    private int tableNumber;
    private String[] orderDetails;
    private String customerType;

    public Order(int tableNumber, String[] orderDetails, String customerType) {
        this.tableNumber = tableNumber;
        this.orderDetails = orderDetails;
        this.customerType = customerType;
        orderID = ++orderId;
    }

    public int getOrderID() {
        return orderID;
    }

    public int getTableNumber() {
        return tableNumber;
    }

    public String[] getOrderDetails() {
        return orderDetails;
    }

    public String getType() {
        return customerType;
    }

    public String toString() {
        return String.format("%d %s", orderID, customerType);
    }

    public static void main(String[] args) {
        Order order1 = new Order(0, null, VIP);
        Order order2 = new Order(0, null, REGULARS);
        Order order3 = new Order(0, null, REGULARS);
        List<Order> list = new ArrayList<>();
        list.add(order3);
        list.add(order2);
        list.add(order1);
        System.out.println("Unordered: " + list);
        Collections.sort(list, new OrderComparator());
        System.out.println("Ordered: " + list);
    }
}

class OrderComparator implements Comparator<Order> {

    @Override
    public int compare(Order o1, Order o2) {
        if (o1.getType().equals(o2.getType())) {
            return o1.getOrderID() - o2.getOrderID();
        }
        else {
            if (Order.VIP.equals(o1.getType())) {
                return -1;
            }
            else if (Order.VIP.equals(o2.getType())) {
                return 1;
            }
            else if (Order.REGULARS.equals(o1.getType())) {
                return -1;
            }
            else if (Order.REGULARS.equals(o2.getType())) {
                return 1;
            }
            else if (Order.NEWBIES.equals(o1.getType())) {
                return -1;
            }
            else if (Order.NEWBIES.equals(o2.getType())) {
                return 1;
            }
            throw new RuntimeException("Unexpected customer type.");
        }
    }
}

我加了一个方法 main 上课 Order 为了测试代码。
我加了一个方法 toString 上课 Order 以便能够检查代码是否产生预期的结果。
我知道你想要一种分子 Order 物体。因此,我成为会员 orderID 自每个 Order 有自己的id,我添加了一个新的静态成员 orderId (注意java是区分大小写的),它为每个新订单生成一个新的、唯一的订单id Order 对象
您希望vip订单先于普通订单,您希望普通订单先于新手订单。默认情况下 Comparator 按升序排序,因此您希望vip最低,新手最高(仅用于排序目的)。所以在方法上 compare (阶级的) OrderComparator ),例如,如果 o1 是vip和 o2 是常客,那么你希望vip比常客低。因此,在这种情况下,方法 compare 返回-1(减1)。
运行上述代码将生成以下输出。

Unordered: [3 REGULARS, 2 REGULARS, 1 VIP]
Ordered: [1 VIP, 2 REGULARS, 3 REGULARS]

请注意,由于 customerType (在课堂上) Order )是一个 String ,则有可能 Order 对象将使用无效的 customerType 价值您可以更改类的构造函数 Order 并添加对所提供值的检查(对于 customerType )然后扔一个 Exception 如果提供的值无效。或者可以使用枚举(也称为枚举类型)。下面的代码使用 enum 而不是 String 对于 customerType -这也简化了方法 compare 课堂上 OrderComparator .

import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
import java.util.List;

public class Order {
    private static int  orderId;

    private int orderID;
    private int tableNumber;
    private String[] orderDetails;
    private CustomerType customerType;

    public Order(int tableNumber, String[] orderDetails, CustomerType customerType) {
        this.tableNumber = tableNumber;
        this.orderDetails = orderDetails;
        this.customerType = customerType;
        orderID = ++orderId;
    }

    public int getOrderID() {
        return orderID;
    }

    public int getTableNumber() {
        return tableNumber;
    }

    public String[] getOrderDetails() {
        return orderDetails;
    }

    public CustomerType getType() {
        return customerType;
    }

    public String toString() {
        return String.format("%d %s", orderID, customerType);
    }

    public static void main(String[] args) {
        Order order1 = new Order(0, null, CustomerType.VIP);
        Order order2 = new Order(0, null, CustomerType.REGULARS);
        Order order3 = new Order(0, null, CustomerType.REGULARS);
        List<Order> list = new ArrayList<>();
        list.add(order3);
        list.add(order2);
        list.add(order1);
        System.out.println("Unordered: " + list);
        Collections.sort(list, new OrderComparator());
        System.out.println("Ordered: " + list);
    }
}

class OrderComparator implements Comparator<Order> {

    @Override
    public int compare(Order o1, Order o2) {
        if (o1.getType().equals(o2.getType())) {
            return o1.getOrderID() - o2.getOrderID();
        }
        else {
            return o2.getType().ordinal() - o1.getType().ordinal();
        }
    }
}

enum CustomerType {
    NEWBIES, REGULARS, VIP
}
svdrlsy4

svdrlsy42#

您可以阅读以下问题:如何按多个字段对集合进行排序。特别是第二个答案,第一个选项。

相关问题