【问题标题】:How to extract a specific value from a LinkedHashMap to insert it into an array如何从 LinkedHashMap 中提取特定值以将其插入数组
【发布时间】:2021-02-27 06:07:54
【问题描述】:

Assignment instructions 我的教授希望我们使用哈希图和数组来找到从一个机场到另一个机场的最快路线,给定航班列表。他希望我们在遍历哈希图时填充数组,找到每个机场最快的航班。我已经在链接列表的一个单元格中创建了包含航班目的地以及出发时间和到达时间的哈希图,但是当我尝试提取离开机场的每个航班的出发和到达时间时插入他们进入我不能的数组。有没有办法从散列内每个单元格中具有多个值的链表中提取特定值,还是应该以另一种方式进行?我已确认哈希图具有正确的信息并且运行正常我只是无法或不知道如何访问哈希图内部的信息以将其发送到数组。 What the information inside the debugger looks like

LinkedHashMap<String, LinkedList<Info>> airportsHash = new LinkedHashMap<String, LinkedList<Info>>();
LinkedList<Info> destinations;

public Info (String destination, double departureTime, double arrivalTime){
        this.destination = destination;
        this.departureTime = departureTime;
        this.arrivalTime = arrivalTime;
    }
public void fillHash(String origin, String destination, double departureTime, double arrivalTime) {
        if(airportsHash.containsKey(origin)){
            destinations = airportsHash.get(origin);
            destinations.add(new Info(destination, departureTime/100, arrivalTime/100));
        }
        else{
            destinations = new LinkedList<Info>();
            destinations.add(new Info(destination, departureTime/100, arrivalTime/100));
            airportsHash.put(origin, destinations);
        }
    }

【问题讨论】:

  • 欢迎来到 SO。我不清楚你的数据结构是什么问题。例如,在 LinkedList 类中实际上不可能实现“每个单元格中具有多个值的链表”。类似地,“包含航班目的地的哈希图以及出发时间和到达时间都在链表的一个单元格中”和“哈希中的每个单元格”很难在没有代码的情况下进行描绘。您能否提供一些代码以更清楚地说明您的结构是如何工作的?
  • 抱歉,我已将添加所有信息的代码放入 hashmap/链表中。老实说,这是我第一次使用 hashmap,所以我这样做纯粹是基于 youtube 上的视频和其他人在这里提出的其他问题,所以我的知识非常有限。如果我张贴说明中他解释他想要什么的部分会有帮助吗?

标签: java arrays linked-list hashmap


【解决方案1】:

首先只是一些一般性的指针:

  • 当您在问题中使用“散列”一词时,您的真正意思是“地图”。使用散列是实现映射的常用方法,但不是唯一方法(搜索树是另一种常用技术)。最好使用结构的名称而不是实现的名称
  • 同样,您应该使用适当的接口而不是实现类来声明变量。请参阅下面的示例
  • 记录已被引入 Java。如果您使用的是最新版本的 Java,它们是定义直接数据记录(例如 Info)的好方法
  • Map 中有一些方法可以在不使用 if 语句的情况下轻松处理丢失的键

所以做出这些改变:

record FlightInfo(String destination, double departureTime, double arrivalTime) { }

Map<String,List<FlightInfo>> airportFlightMap = new HashMap<>();

public void addFlight(String origin, String destination, double departureTime, double arrivalTime) {
    airportFlightMap
        .computeIfAbsent(origin, o -> new ArrayList<>())
        .add(new FlightInfo(destination, departureTime, arrivalTime));
}

最好有一个包含航班的 Airport 类,但这超出了您的问题范围。

当我试图提取每个人的出发和到达时间时 离开机场的航班将它们插入我不能的数组中。是 有一种方法可以从链表中提取特定值 哈希内每个单元格中的多个值还是我应该继续 另一种方式?

从字面上理解您的问题,提取每个离开机场的航班的出发和到达时间的方法:

List<Double> departureTimes = airportFlightMap.get(airportName)
    .stream().map(FlightInfo::departureTime).collect(Collectors.toList());
List<Double> arrivalTimes = airportFlightMap.get(airportName)
    .stream().map(FlightInfo::arrivalTime).collect(Collectors.toList());

虽然我不确定这如何让您更接近找到从一个机场到另一个机场的最快路径的目标。为此,您需要一个搜索算法。例如,在伪代码中

find path(current route, destination):
    if end of current route = destination:
        process path
    else
        for each flight from end of current route:
            if next airport not in current route:
                find path(current route + next airport, destination)

在该算法中,您可能希望将原点和FlightInfo 列表存储为当前路线。这样您就可以轻松比较到达时间以找到最佳路线。

【讨论】:

  • 感谢您的所有建议,不幸的是,我的教授告诉我不允许使用 ArrayLists(不知道为什么),所以我坚持使用 LinkedLists,因为他建议我们使用它。对于提取每个离开机场的航班的出发和到达时间的代码,我的 IDE 显示了离开时间和到达时间的错误,因为它们不是方法。这只是我的误解和我的错误,还是双冒号不是正确的运算符?非常感谢您的帮助。
  • 我之所以使用这种使用出发和到达时间的方法是因为我的教授希望我们使用一个数组形式的二进制堆,其中填充了离开机场的航班以及一个提取分钟基于时间找到到另一个给定机场的最短路径的方法。不确定是否有更简单的方法可以做到这一点,但我不明白,但这就是它在我脑海中的运作方式。
  • arrivalTimedepartureTime 方法是由我的代码中的记录生成的。如果您不使用记录,它们将不存在。使用链表而不是数组列表很好——它们实现了相同的List 接口。您关于以任何数组的形式实现二进制堆的 cmets 让我对您的实际问题感到困惑。
  • 知道了,我对使用记录实现犹豫不决,因为我们提交的方式是通过 Gradescope 上的自动评分器,因此它不是最新的 java 14 可能会导致我的程序无法通过测试用例.有没有办法在不使用记录的情况下做到这一点?抱歉,我的第二条评论不清楚。我相信这个项目是为了让我们熟悉时间图和 Dijkstra 算法,因此使用数组和映射来完成这一点,如我附在原始帖子中的第一张图片中所述。感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 2019-12-31
  • 1970-01-01
  • 2017-07-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多