在从ArrayList返回变量之前,如何比较两个对象中包含的变量?

时间:2018-07-24 14:10:04

标签: java

我有一个FlightDatabase类,其中包含许多AirJourney个对象,这些空中旅行对象具有以下详细信息:始发机场,目的地机场和飞行英里数。

例如,一个AirJourney对象可能具有“起点”:A,“目的地”:B和“英里”:400。

以下字符串数组表示数据库中存在的每个AirJourney对象,第一个字母为起点,第二个为目的地,第三个为飞行里程数。

"AB800", "BC900", "CD400", "DE400", "BF400", "CE300", "DE300", "EB600", "CE200", "DC700", "EB500", "FD200"

在此字符串中,有许多重复的排行:DE400DE300,然后是CE300CE200

我需要能够从AirJourney返回FlightDatabase个对象,并且还要忽略任何飞行距离更高的航班。

以下方法允许通过使用由两个字母组成的字符串从数据库中返回AirJourney对象,这两个字母将与对象内的始发和目的地机场相匹配。但是,此方法将返回第一个匹配的对象,而不是最少的里程数。

public AirJourney getFlightDetailsFromAirportPairing(String airportPair)
    {
        for(AirJourney journey : database)
        {
            String journeyPair = journey.getOriginAirport() + journey.getDestinationAirport();
            if(airportPair.equals(journeyPair))
            {
                return journey;
            }
        }

        return new AirJourney(0, null, null);
    }

例如,如果我调用`getFlightDetailsFromAirportPairing(“ DE”),则将返回DE400航班,而我却希望返回DE300航班而忽略DE400航班。

我不确定如何修改此方法,以便它返回最低里程的航班。

3 个答案:

答案 0 :(得分:1)

也许可以使用类似的东西?

想法是存储看到的最低值,每当看到具有较低值的东西时,就存储AirJourney对象和距离。

public AirJourney getFlightDetailsFromAirportPairing(String airportPair){
        double lowestDistance = Double.MAX_VALUE;
        AirJourney lowestDistanceAirJourney = null;
        for (AirJourney journey : database) {
            String journeyPair = journey.getOriginAirport() + journey.getDestinationAirport();
            if(airportPair.equals(journeyPair)) {
                if (lowestDistanceAirJourney == null || journey.getMiles() < lowestDistance) {
                    lowestDistanceAirJourney = journey;
                    lowestDistance = journey.getMiles();
                }
            }
        }
        return lowestDistanceAirJourney;
}

答案 1 :(得分:0)

public AirJourney getFlightDetailsFromAirportPairing(String airportPair)
{
    Journey matchJourney = new AirJourney(0, null, null);
    for(AirJourney journey : database)
    {
        String journeyPair = journey.getOriginAirport() + journey.getDestinationAirport();
        if(airportPair.equals(journeyPair))
        {
            if(matchJourney.getMileage() == 0)
            {
                matchJourney = journey;
            }
            else if(journey.getMileage() < matchJourney.getMileage()
            {
                matchJourney = journey;
            }
        }
    }

    return matchJourney;
}

遍历所有旅程,并添加里程检查。

答案 2 :(得分:0)

使用Java 8流使用以下方法,它可能会对您有所帮助:

    public static String getFlightDetailsFromAirportPairing(String airportPair) {
            List<String> database = Arrays.asList("DE400", "DE300");  // you can get it from your database
            String journeyPair = "DE"; // you can get it from your database
            int minimumMiles = database.stream().map(value -> Integer.valueOf(value.split("(?<=\\D)(?=\\d)")[1])).collect(Collectors.toList()).stream().reduce((x, y) -> x.compareTo(y) <= 0  ? x : y).get();
            if (airportPair.equals(journeyPair) ) {
                return journeyPair + minimumMiles;
            } else {
                return null;
            }           
}

对于旅途中的最低里程,可以使用:

int minimumMiles = database.stream().map(journey -> journey.getMiles()).collect(Collectors.toList()).stream().reduce((x, y) -> x.compareTo(y) <= 0  ? x : y).get();

我假设getMiles()返回的是integer,如果不是,则必须使用Integer.valueOf(journey.getMiles()) 它将获得airportPair的最小英里数,然后给出结果。

请告诉我这是否对您有用。