Java航班图:正确计算并显示经停城市连接及其总距离

Java航班图:正确计算并显示经停城市连接及其总距离

本教程详细指导如何在java航班图程序中正确显示指定经停城市的所有直接连接及其累计总距离。文章分析了现有代码中`showconnections`方法的不足,并提供了优化方案,包括如何根据经停城市过滤连接、传递初始距离参数以及正确计算并输出从起始城市到终点城市的总距离,以实现清晰、准确的航班路径展示。

引言:理解问题

在构建航班路线图的程序中,一个常见的需求是,当用户选择一个经停城市后,程序能清晰地展示从该经停城市出发的所有直接连接,并计算出从最初的起始城市到这些终点城市的总距离。原始代码中的showConnections方法存在一个核心问题:它遍历了整个航班图的所有连接,而不是仅限于用户指定的经停城市。此外,用于显示连接的connect方法也未能接收并处理从起始城市到经停城市的累计距离,导致无法计算完整的行程距离。

本教程旨在解决这些问题,通过修改showConnections和connect方法,使其能够准确地过滤连接并计算总距离。

核心概念:图表示与连接

在提供的代码中,航班网络被表示为一个图结构,具体实现如下:

HWGraph 类:作为图的容器,使用 HashMap<String, ArrayList> graphMap 来存储图的邻接列表。其中,String 代表城市标签(节点),ArrayList 存储与该城市直接相连的所有目标城市及其之间的距离。Vertex 类:表示图中的一个顶点(或边),包含 label(城市名称)和 weight(到达该城市的距离)。在 graphMap 的 ArrayList 中,Vertex 实例表示从键城市到 label 城市的边,weight 为边的权重。addEdge(String label1, Vertex v) 方法:用于在 label1 城市和 v.label 城市之间添加一条有向边,权重为 v.weight。getConnections(String label) 方法:根据城市标签获取该城市的所有直接连接(即其邻接列表)。getThisVertex(String startCity, String destCity) 方法:这个方法非常关键,它用于从 startCity 的连接中找到 destCity 对应的 Vertex 对象。这个 Vertex 对象不仅包含 destCity 的标签,还包含了从 startCity 到 destCity 的距离,这正是我们需要的“初始距离”。

解决方案:优化showConnections与connect方法

要正确显示经停城市的连接和总距离,我们需要对 HWDriverPrep.java 中的 main、showConnections 和 connect 方法进行以下修改:

立即学习“Java免费学习笔记(深入)”;

main 方法:确保在调用 showConnections 时,传入的 layOver Vertex 对象包含了从起始城市到经停城市的距离。原始代码中 Vertex v = g.getThisVertex( startCity, layOver); 已经正确获取了包含此距离的 Vertex。

showConnections 方法

它不应再遍历整个 graphMap。它应该利用 HWGraph 类的 getConnections 方法,直接获取 layOverVertex.label(经停城市)的所有直接连接。然后,它将遍历这些特定的连接,并为每个连接调用一个辅助方法(例如重构后的 connect 方法),同时传递从起始城市到经停城市的距离。

connect 方法

小爱开放平台 小爱开放平台

小米旗下小爱开放平台

小爱开放平台 281 查看详情 小爱开放平台 其签名需要修改,以接受当前连接的起始城市、目标城市 Vertex 对象以及从最初起始城市到经停城市的累计距离。它将负责计算从最初起始城市到当前终点城市的总距离(即 initialDistance + toCity.weight),并以清晰的格式输出。

详细修改步骤与代码

1. 修改 HWDriverPrep.java 中的 showConnections 方法

不再使用 g.graphMap.forEach 遍历整个图,而是直接获取经停城市的连接。

// HWDriverPrep.java// ... 其他代码 ...private static void showConnections(HWGraph g, Vertex layOverVertex) {    String layoverCityLabel = layOverVertex.label;    int distanceToLayover = layOverVertex.weight; // 从起始城市到经停城市的距离    // 获取从经停城市出发的所有直接连接    ArrayList connectionsFromLayover = g.getConnections(layoverCityLabel);    System.out.printf("n从经停城市 %s 出发的连接 (从起始城市到此距离: %d):n",                      layoverCityLabel, distanceToLayover);    if (connectionsFromLayover != null && !connectionsFromLayover.isEmpty()) {        for (Vertex connectedCity : connectionsFromLayover) {            // 为每个连接调用重构后的 connect 方法            connect(layoverCityLabel, connectedCity, distanceToLayover);        }    } else {        System.out.println("未找到从 " + layoverCityLabel + " 出发的直接连接。");    }}// ... 其他代码 ...

2. 重构 HWDriverPrep.java 中的 connect 方法

修改 connect 方法的签名和逻辑,使其能接收并处理累计距离。

// HWDriverPrep.java// ... 其他代码 ...// 重构后的 connect 方法,用于显示单个连接及其总距离private static void connect(String fromCity, Vertex toCity, int initialDistance) {    int totalDistance = initialDistance + toCity.weight; // 计算总距离    System.out.printf("%s -> %s (本段距离: %d), 从起始城市总距离: %dn",                      fromCity, toCity.label, toCity.weight, totalDistance);}// ... 其他代码 ...

3. main 方法的调用(无需修改,但需理解)

main 方法中对 showConnections 的调用 showConnections( g, v ); 已经传入了正确的 Vertex v 对象,该对象是通过 g.getThisVertex( startCity, layOver) 获取的,其中包含了从 startCity 到 layOver 的距离(v.weight)。

示例代码

以下是 HWDriverPrep.java 中经过修改后的关键部分:

// HWDriverPrep.javaimport java.util.ArrayList;import java.util.Map;import java.util.Scanner;import java.util.Set;public class HWDriverPrep {    public static void main(String[] args) {        HWGraph g = createGraph();        printGraph( g ); // 打印整个图的连接,用于调试或概览        Set keys = g.getKeys();        String startCity = "Chicago";        String layOver = getLayOverCity( keys, startCity); // 获取用户输入的经停城市        // 获取从起始城市到经停城市的Vertex对象,其中包含了该段的距离        Vertex v = g.getThisVertex( startCity, layOver);         if (v == null) {            System.out.println("经停城市 " + layOver + " 未在从 " + startCity + " 出发的路径中找到。");            return;        }        System.out.printf("n从起始城市: %s 到经停城市: %s (距离: %d) 的连接如下:n",                           startCity, v.label, v.weight);        // 调用修改后的 showConnections 方法        showConnections( g, v );    }    private static void printGraph(HWGraph g) {        System.out.println("n--- 完整航班图连接 ---");        g.graphMap.forEach(                (key,value) -> show(key,value));        System.out.println("--------------------");    }    private static void show(String key, ArrayList value) {        System.out.println("城市: " + key + " 的连接:");        for(Vertex v : value){            System.out.println("  -> " + v.label + " (距离: " + v.weight + ")");        }    }    private static String getLayOverCity(Set keys, String startCity) {        Scanner s = new Scanner(System.in);        String oStr = "";        String cm = "";        for(String item: keys)        {            oStr += cm + item;            cm = ", ";        }        System.out.printf("n请选择一个经停城市 (%s): ",oStr);        String retItem = s.nextLine();        return retItem;    }    // 修改后的 showConnections 方法    private static void showConnections(HWGraph g, Vertex layOverVertex) {

以上就是Java航班图:正确计算并显示经停城市连接及其总距离的详细内容,更多请关注创想鸟其它相关文章!

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/864135.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
悟空浏览器如何将标签页固定到任务栏 悟空浏览器网页应用创建与管理
上一篇 2025年11月28日 01:13:10
wps office和microsoft office区别对比
下一篇 2025年11月28日 01:13:11

相关推荐

  • Java中如何填充颜色 掌握区域填充的实现

    Java中如何填充颜色 掌握区域填充的实现Java中如何填充颜色 掌握区域填充的实现Java中如何填充颜色 掌握区域填充的实现Java中如何填充颜色 掌握区域填充的实现

    在java中填充颜色,核心在于操作图像像素并使用java的图像处理api。1. 创建bufferedimage对象作为图像缓冲区;2. 通过creategraphics()获取graphics2d对象用于绘制;3. 使用setcolor()设置填充颜色;4. 调用fillrect()或fill()方…

    2026年8月26日 用户投稿
    000
  • 上市之路“一波三折”,京东工业离招股书再次失效仅剩4天!

    上市之路“一波三折”,京东工业离招股书再次失效仅剩4天!上市之路“一波三折”,京东工业离招股书再次失效仅剩4天!上市之路“一波三折”,京东工业离招股书再次失效仅剩4天!上市之路“一波三折”,京东工业离招股书再次失效仅剩4天!

    刘强东何时能收获第6家上市公司? 作者 | 郝文 编辑 | 趣解商业TMT组 “工业品界的京东”要上市了! 京东旗下的B2B采购平台“京东工业”,是专注于工业品供应链的服务商,它如同一个面向企业的“超级货仓”,从小小的螺丝螺母到大型专业设备,均可在上面一站式采购。 近日,证监会官网最新发布的备案通知…

    2026年8月26日 用户投稿
    000
  • 聊聊zfs中的write

    以下是关于zfs和zpool的伪原创内容,保持了原文的结构和大意,同时进行了改写: // 创建一个zpool$ modprobe zfs$ zpool create -f -m /sample sample -o ashift=12 /dev/sdc$ zfs create sample/fs1 -…

    2026年8月26日
    000
  • 大疆无人机怎么用后期处理_大疆无人机拍摄素材后期处理软件与流程

    使用大疆无人机航拍后,可通过DJI Mimo App快速剪辑并还原D-Log色彩,影忆实现全自动调色与AI字幕,DaVinci Resolve进行专业级调色优化,Photoshop合成AEB连拍HDR照片,Pix4Dmapper处理带POS信息的测绘影像,满足从短视频到专业建模的全流程需求。 如果您…

    2026年8月25日
    000
  • Java中collect方法怎么用 掌握流结果收集的各种方式

    Java中collect方法怎么用 掌握流结果收集的各种方式Java中collect方法怎么用 掌握流结果收集的各种方式Java中collect方法怎么用 掌握流结果收集的各种方式Java中collect方法怎么用 掌握流结果收集的各种方式

    java的collect方法是stream api中的终结操作,用于将流元素收集到指定数据结构中。其核心在于supplier、accumulator和combiner三个参数:1.supplier创建结果容器;2.accumulator将元素添加到容器;3.combiner合并多个容器结果。常用co…

    2026年8月25日 用户投稿
    000
  • 掌上高考志愿填报可靠吗

    掌上高考的准确性取决于数据来源与推荐逻辑透明度,其高校录取数据需核对是否来自教育部阳光高考平台或省级考试院,并对比目标院校官网公布的历年分数,偏差超5分应警惕;智能推荐功能须提供算法说明,明确使用位次法或线差法,纳入招生变动信息,且支持个性化调整,否则可信度受限。 如果您正在为高考志愿填报寻找可靠的…

    2026年8月25日
    200
  • 告别繁琐的对象映射:如何使用JoliCodeAutoMapper优化PHP开发效率

    最近在开发一个复杂的后端系统时,我遇到了一个反复出现的“痛点”:对象映射。想象一下这样的场景:你从前端接收一个 JSON 请求体,首先将其反序列化到一个 UserRequestDTO 对象。然而,你的业务逻辑和数据库操作需要的是一个 User 领域实体。这意味着你需要手动编写大量的代码,将 User…

    用户投稿 2026年8月25日
    000
  • 如何解决Magento2图片加载慢的问题,使用Composer和WebP模块让你的电商网站飞起来

    Composer在线学习地址:学习地址 痛点:电商网站的“甜蜜负担”——图片 在电商领域,高质量的产品图片是吸引顾客、促成转化的关键。然而,这些精美的图片也常常成为网站性能的“甜蜜负担”。当用户访问一个图片众多的商品列表页或详情页时,浏览器需要下载大量的图片资源,这直接导致页面加载时间过长。 我曾在…

    用户投稿 2026年8月25日
    000
  • 第三方SDK(支付、短信、邮件)集成

    集成第三方sdk的步骤包括关注安全性、性能和用户体验。1) 确保api密钥安全存储和传输,使用https保护数据。2) 优化api调用频率,避免性能瓶颈。3) 提供友好的错误处理和反馈机制,提升用户体验。4) 合理控制短信和邮件发送频率和数量,管理成本。 在现代软件开发中,第三方SDK的集成是提升应…

    2026年8月25日
    100
  • PHP中复杂异步操作的回调地狱与阻塞困境:GuzzlePromises如何优雅化解

    可以通过一下地址学习composer:学习地址 在现代web应用开发中,php早已不再局限于简单的页面渲染,而是越来越多地承担起与各种外部服务(如微服务、第三方api、数据库等)进行复杂交互的任务。想象一下,你正在开发一个电商网站的商品详情页,需要同时从多个数据源获取信息:商品基本信息、用户评论、库…

    用户投稿 2026年8月25日
    000
  • kimichat官网入口地址分享-kimichat最新官网登录网址获取

    Kimi官网入口为https://kimi.moonshot.cn/,支持手机号快捷登录,具备实时联网搜索、大文件上传解析、多轮对话管理及Kimi+智能应用等功能,提供跨设备同步与简洁交互体验。 ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜…

    2026年8月25日
    000
  • C语言实现1到100累加

    C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加C语言实现1到100累加

    本题难度较低,可通过循环结构实现累加计算,重点在于使用三种不同的循环语句完成相同功能。 1、 启动CodeBlocks开发环境,创建一个新项目以进行后续操作。 2、 选择C语言类型,并将项目命名为MaxNum,方便后期维护与识别。 3、 按照提示继续操作,直至项目创建成功。 立即学习“C语言免费学习…

    2026年8月25日 用户投稿
    000
  • VSCode怎么切换解释器_VSCode更换Python/Node等运行环境教程

    答案:在VSCode中切换解释器需通过命令面板或状态栏选择Python解释器,使用nvm或配置settings.json切换Node版本,遇报错可重启、检查扩展与路径,避免自动回切需手动指定并禁提示。 在VSCode中切换解释器,其实就是告诉VSCode用哪个Python环境,或者哪个Node版本来…

    2026年8月25日
    000
  • 电脑USB接口失灵怎么办 一文教你快速修复

    电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复电脑USB接口失灵怎么办 一文教你快速修复

    usb接口作为现代计算机与外部设备通信的重要通道,一旦出现故障,往往会影响日常使用。但大多数情况下,这类问题并非无法解决。本文将由浅入深,系统地为您介绍多种有效的修复方案,帮助您快速恢复usb接口的正常功能。 一、检查物理连接并重启设备 首先应排除最基础的硬件连接问题。重新插拔设备、重启电脑,并尝试…

    2026年8月25日 用户投稿
    000
  • CSRF(跨站请求伪造)防护机制

    有效防护csrf攻击的方法包括:1. 使用csrf token,通过在表单中嵌入随机生成的token并在提交时验证其匹配性,确保请求合法性;2. 同源检测,通过检查请求的origin和referer头,确保请求来自同一个域名;3. 双重cookie验证,将token存储在cookie和请求头中,验证…

    2026年8月25日
    000
  • 兆易创新Q1营收预计达19.09亿元,同比环比双增长

    ☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 免费无限量使用 DeepSeek R1 模型☜☜☜ 4月8日,兆易创新发布公告称,经公司财务部门初步测算,公司预计2025年第一季度实现营业收入19.09亿元左右,同比增长17.32%左右,环比增长11.88%左右。2024年第四季度至2025年…

    2026年8月25日
    100
  • Java中Spring Test的作用 解析上下文

    Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文Java中Spring Test的作用 解析上下文

    spring test的主要作用是提供隔离环境以测试spring组件并解析上下文,其核心价值在于简化测试配置。1. 使用@contextconfiguration注解加载测试上下文,可通过xml配置文件或java配置类定义测试专用bean;2. 通过@runwith(springrunner.cla…

    2026年8月25日 用户投稿
    000
  • 电商平台如何高效集成Heureka“Ověřenozákazníky”服务?Composer与heureka/overeno-zakazniky库的完美实践

    可以通过一下地址学习composer:学习地址 作为一名电商平台的开发者,你是否曾为了提升用户信任度,绞尽脑汁想要接入一些权威的第三方认证服务?在捷克和斯洛伐克市场,heureka的“ověřeno zákazníky”(客户认证)服务无疑是建立消费者信心的金字招牌。它允许真实购买的客户留下评价,这…

    用户投稿 2026年8月25日
    400
  • 抖音小程序如何助力营销?成功案例与玩法解析

    抖音小程序能为品牌带来哪些营销突破? 在流量竞争日益激烈的当下,越来越多品牌将目光投向抖音小程序,试图打通内容与转化之间的最后一环。那么,抖音小程序究竟在营销生态中扮演怎样的角色?它不仅能帮助品牌构建高效的转化路径,还能实现用户资产的长期沉淀。依托于抖音庞大的日活和精准推荐机制,小程序可无缝嵌入短视…

    2026年8月25日
    100
  • Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法

    Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法Java中synchronized关键字怎么用 详解Java同步锁的4种使用方法

    synchronized关键字在java中用于实现线程同步,确保多线程并发访问共享资源时的互斥执行。其主要使用方式包括:1. 同步代码块,通过指定对象作为锁;2. 同步方法,锁为当前对象(this)或类对象(class);3. 静态同步方法,等价于使用类对象作为锁;4. 同步静态变量,通常使用静态对…

    2026年8月25日 用户投稿
    600

发表回复

登录后才能评论
关注微信