我有一个优先级队列,其中包含一个名为“RouteInfo”的对象,
public class RouteInfo{
private double totalCost;
private double totalLeadTime;
private int numberOfLanes;
private double totalDistance;
}
我需要根据值totalCost将此对象添加到优先级队列中。但有时这个值在两个对象之间可能是相同的,那时我需要比较 numberOfLanes 值,如果这也相同,那么我将选择 TotalDistance。我为此定义了一个 RouteComparator 类,但似乎不起作用。
private class RouteComparator implements Comparator<RouteInfo>{
@Override
public int compare(RouteInfo routeInfoOne, RouteInfo routeInfoTwo) {
if(Objects.equals(routeInfoOne.getTotalCost(),routeInfoTwo.getTotalCost())){
if(routeInfoOne.getNumberOfLanes()==routeInfoTwo.getNumberOfLanes()){
if(Objects.equals(routeInfoOne.getTotalLeadTime(),routeInfoTwo.getTotalLeadTime())){
if(routeInfoOne.getTotalDistance()<routeInfoTwo.getTotalDistance()){
return 1;
} else if (routeInfoOne.getTotalDistance()>routeInfoTwo.getTotalDistance()) {
return -1;
}else{
return 0;
}
}else if(routeInfoOne.getTotalLeadTime()<routeInfoTwo.getTotalLeadTime()){
return 1;
}else if(routeInfoOne.getTotalLeadTime()>routeInfoTwo.getTotalLeadTime()){
return -1;
}
}else if(routeInfoOne.getNumberOfLanes()<routeInfoTwo.getNumberOfLanes()){
return 1;
}else if(routeInfoOne.getNumberOfLanes()>routeInfoTwo.getNumberOfLanes()){
return -1;
}
}else if (routeInfoOne.getTotalCost() < routeInfoTwo.getTotalCost()) {
return 1;
}else if (routeInfoOne.getTotalCost() > routeInfoTwo.getTotalCost())
return -1;
return 0;
}
}
这是正确的吗?我需要为此做些什么吗?
当前实施的认知复杂性是巨大的,难怪它不起作用。使用提供的工厂方法来简化它:
接受一个从类型 T 中提取双排序键的函数,并返回一个按该排序键进行比较的比较器。
返回一个字典顺序比较器,其中包含提取 int 排序键的函数。
返回一个字典顺序比较器,其中包含提取双排序键的函数。
那么整个比较器就变成这样了:
Comparator<RouteInfo> comparator = Comparator.comparingDouble(RouteInfo::getTotalCost)
.thenComparingInt(RouteInfo::getNumberOfLanes)
.thenComparingDouble(RouteInfo::getTotalDistance);