我有以下问题要解决。我正在使用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());
}
}
2条答案
按热度按时间xt0899hw1#
不仅要对多个字段进行排序,还需要对其中一个字段进行自定义排序。
在下面的代码中,我填写了两个类中缺少的部分
Order
和阶级OrderComparator
. 代码后面的注解。我加了一个方法
main
上课Order
为了测试代码。我加了一个方法
toString
上课Order
以便能够检查代码是否产生预期的结果。我知道你想要一种分子
Order
物体。因此,我成为会员orderID
自每个Order
有自己的id,我添加了一个新的静态成员orderId
(注意java是区分大小写的),它为每个新订单生成一个新的、唯一的订单idOrder
对象您希望vip订单先于普通订单,您希望普通订单先于新手订单。默认情况下
Comparator
按升序排序,因此您希望vip最低,新手最高(仅用于排序目的)。所以在方法上compare
(阶级的)OrderComparator
),例如,如果o1
是vip和o2
是常客,那么你希望vip比常客低。因此,在这种情况下,方法compare
返回-1(减1)。运行上述代码将生成以下输出。
请注意,由于
customerType
(在课堂上)Order
)是一个String
,则有可能Order
对象将使用无效的customerType
价值您可以更改类的构造函数Order
并添加对所提供值的检查(对于customerType
)然后扔一个Exception
如果提供的值无效。或者可以使用枚举(也称为枚举类型)。下面的代码使用enum
而不是String
对于customerType
-这也简化了方法compare
课堂上OrderComparator
.svdrlsy42#
您可以阅读以下问题:如何按多个字段对集合进行排序。特别是第二个答案,第一个选项。