通过多重比较在优先级队列中添加对象

问题描述 投票:0回答:1

我有一个优先级队列,其中包含一个名为“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;
        }
        
    }

这是正确的吗?我需要为此做些什么吗?

java priority-queue
1个回答
0
投票

当前实施的认知复杂性是巨大的,难怪它不起作用。使用提供的工厂方法来简化它:

  1. Comparator.comparingDouble()

接受一个从类型 T 中提取双排序键的函数,并返回一个按该排序键进行比较的比较器。

  1. Comparator.thenComparingInt()

返回一个字典顺序比较器,其中包含提取 int 排序键的函数。

  1. Comparator.thenComparingDouble()

返回一个字典顺序比较器,其中包含提取双排序键的函数。

那么整个比较器就变成这样了:

Comparator<RouteInfo> comparator = Comparator.comparingDouble(RouteInfo::getTotalCost)
            .thenComparingInt(RouteInfo::getNumberOfLanes)
            .thenComparingDouble(RouteInfo::getTotalDistance);
© www.soinside.com 2019 - 2024. All rights reserved.