如何使用compareTo按降序排列航班

时间:2012-12-13 00:09:11

标签: java hashmap compareto

我正在创建一个飞行控制器应用程序。我想要的一些功能是能够告诉用户根据特定航空公司的下一班航班是什么。我有一个存储字符串和平面的哈希映射。在我的飞机类中,我正在实现Comparable,我有compareTo方法。任何人都可以帮我实现使用compareTo方法按降序排列飞机以显示下一个航班。我希望通过变量逾期安排航班。

在MainApp中我必须使用compareTo

switch (nextChoice) 
                    {
                    case 1:
                        airlineMap.printAirline("Aer Lingus");
                        break;
                    case 2:
                        airlineMap.printAirline("Brittish Airways");
                        break;
                    case 3:
                        airlineMap.printAirline("Eithad");
                        break;
                    case 4:
                        airlineMap.printAirline("Iberia");
                        break;
                    case 5:
                        airlineMap.printAirline("Quantas");
                        break;

我希望将降序添加到航空公司的印刷品:airlineMap.printAirline(“Aer Lingus”);

这是我的飞机课程:

import java.util.LinkedList;

public class Plane implements Comparable
{   
    private String flightNumber;
    public String airlineName;
    private double fuelRemaining;
    private int overdue;
    private int passengerNumber;
    private AIRPLANETYPE planeType;

    public enum AIRPLANETYPE
    {
        AIRBUS("1"), CORPORATE("2"), PRIVATE("3");

        private String planeName;

        private AIRPLANETYPE(String planeName)
        {
            this.planeName = planeName;
        }

        public String getPlaneName()
        {
            return this.planeName;
        }
    }

    public Plane(String flightNumber, String airlineName, double fuelRemaining, int overdue, int passengerNumber, AIRPLANETYPE planeType) {
        this.flightNumber = flightNumber;
        this.airlineName = airlineName;
        this.fuelRemaining = fuelRemaining;
        this.passengerNumber = passengerNumber;
        this.overdue = overdue;
        this.planeType = planeType;
    }


    public String getAirlineName() {
        return airlineName;
    }

    public void setAirlineName(String airlineName) {
        this.airlineName = airlineName;
    }


    public void setOverdue(int overdue) {
        this.overdue = overdue;
    }

    public int getOverdue(){
        return overdue;
    }

    public String getFlightNumber() {
        return flightNumber;
    }

    public void setFlightNumber(String flightNumber) {
        this.flightNumber = flightNumber;
    }

    public double getFuelRemaining() {
        return fuelRemaining;
    }

    public void setFuelRemaining(double fuelRemaining) {
        this.fuelRemaining = fuelRemaining;
    }

    public int getPassengerNumber() {
        return passengerNumber;
    }

    public void setPassengerNumber(int passengerNumber) {
        this.passengerNumber = passengerNumber;
    }

    public AIRPLANETYPE getPlaneType() {
        return planeType;
    }

    public void setPlaneType(AIRPLANETYPE planeType) {
        this.planeType = planeType;
    }

    public int compareTo(Object arg0) {
        if((arg0 != null) && (arg0 instanceof Plane))
        {
            Plane p = (Plane) arg0;
            return (int)Math.ceil(this.overdue - p.getOverdue());
        }
        return 0;
    }
    public String toString() {
        return "Plane: flightNumber=" + flightNumber + "."
                + " airlineName=" + airlineName + "."
                + " fuelRemaining=" + fuelRemaining + " litres."
                + " overdue=" + overdue + " minutes."
                + " passengerNumber="+ passengerNumber + "."
                + " airplaneType=" + planeType + ".\n";
    }
}

1 个答案:

答案 0 :(得分:2)

由于HashMap是无序的,因此您有两种方法可以对您的飞机进行排序:

  • 将它们放入已分类的容器中,或
  • 将它们放入ArrayList<Plane>或数组Plane[],并对该列表或数组进行排序

使用TreeSet<Plane>可以实现第一种方法:将您的飞机放入集合中,并按照“自然”顺序(即与compareTo方法一致的顺序)迭代它们。

第二种方法需要将平面复制到单独的容器或数组中,然后使用sort方法(或Arrays.sort静态方法,如果它是一个数组)来按照您的方式对飞机进行排序使用compareTo实施设置的顺序。

编辑:(基于评论)处理在哈希映射内以特定顺序存储平面的问题的一种方法是制作树集的哈希映射,如下所示: / p>

Map<String,TreeSet<Plane>> airlineMap = new HashMap<String,TreeSet<Plane>>();

一旦您将飞机添加到每家航空公司,它们将根据您的compareTo实施顺序维护。手持TreeSet<Plane>后,您可以通过调用Planehigher轻松找到下一个或前一个lower

您应该在Math.signum方法中使用Math.ceil而不是compareTo