【问题标题】:How do I compare the variables held within two objects before returning them from an ArrayList?如何在从 ArrayList 返回它们之前比较两个对象中保存的变量?
【发布时间】:2018-07-24 14:10:03
【问题描述】:

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

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

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

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

在此字符串中,有多个重复航班:DE400DE300,然后是 CE300CE200

我需要能够从 FlightDatabase 返回 AirJourney 对象,同时忽略任何里程数更高的航班。

下面的方法允许使用由两个字母组成的字符串从数据库中返回 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 航班。

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

【问题讨论】:

  • 您可以创建一个变量来存储最低满足的旅程,该变量适合 airportPair 字符串。而是立即返回旅程,遍历整个数据库,与保存在变量中的旅程进行比较,如果新旅程的长度较短则替换

标签: java


【解决方案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;
}

【讨论】:

    【解决方案2】:
    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;
    }
    

    遍历每段旅程并添加里程检查。

    【讨论】:

      【解决方案3】:

      使用以下使用 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 的最小里程数,然后给出结果。

      请让我知道这是否适合您。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-09-05
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-11-11
        • 1970-01-01
        • 2021-09-06
        • 1970-01-01
        相关资源
        最近更新 更多