您必须创建一个结构,让您可以使用 Dijkstra 算法。为此,您必须从数据库中读取所有相关数据。从关系数据到面向对象的转变总是很尴尬。
理想情况下,您希望对每个表使用单个简单的 SQL 选择来获取数据。优化很棘手。一条 select 语句可以抓取一百万行几乎和抓取一行一样快;一次选择将获得一百万行,而 10 次选择将获得 10 行(根据我的经验)。但是如果你的数据库连接很慢(带宽很窄),那么抓取太多不需要的行可能会花费很长时间。
使用 Maps(TreeMap 或 HashMap)来跟踪您阅读的内容,因此您可以找到已经阅读并放置在您的结构中的“站”对象,并为它们添加连接。
在内存中设置好数据结构后,请尝试尽可能长时间地保留它,以限制重新读取数据库的延迟。
注意你的记忆和时间。您面临运行速度太慢或内存不足的危险。您需要注意性能(这似乎不是常见的需求,这些天)。我提出了一些建议,但我真的不知道你的硬件和数据会发生什么。(例如,读取数据库可能没有我想象的那么慢。)
希望这可以帮助。如果您以前没有做过这样的事情,那么您有很多工作和学习要做。我参与了这样一个主要程序(但它也写到了数据库中),我感觉自己一直在逆流而上。
添加:
您在内存中想要的是一组车站(Station 类对象)和路线(Route 类对象)。每个站点都将拥有描述一个站点所需的所有数据,包括位置。至关重要的是,它还需要一个 ID。站应该使用 ID 作为键进入 TreeMap。(这是我的偏见,很多人会使用 HashMap。)
每条路线都将引用它连接的两个车站、距离或旅行时间以及任何其他需要的信息。
每个站还将包含引用它的路线列表。我建议使用 LinkedList 以提高灵活性。(在这种情况下,ArrayList 很容易在未使用的数组元素上浪费大量空间。)您需要从数据库中读取站点,然后读取路线信息。当您阅读每条路线的信息时,创建 Route 对象,找到两个站点,将它们的引用添加到 Route,然后将 Route 添加到两个站点的路线列表中。
现在,对于每个车站,您可以找出所有离开它的路线,然后找出您可以通过一次巴士旅行到达的所有车站。从这些站点,您可以通过您的网络继续工作。如果你想这样想的话,这个结构确实是一个“稀疏数组”。
应用 Dijkstra 的算法——或任何其他算法——非常简单。您需要车站和路线(Station 和 Route 类中的字段)上的各种标志来跟踪您已将哪些节点(车站)和连接(路线)用于各种目的。在一张纸上绘制地图(从一个小地图开始!)以跟踪您的代码在做什么可能会有所帮助。我的经验是,做这一切只需要很少的代码,但需要很多仔细的思考。