一个用Dijkstra算法实现的路由算法的java程序——2 GraphFromFile类
import java.io.*;
import java.util.*;
import javax.swing.JOptionPane;
/**
* 类GraphFromFile用于从文件读入图的信息。
* 包括:图的结点个数及其邻接关系、图中边的权值、图中结点显示的位置坐标
* 以及各结点对应的名称。
* <p>
* <b>其中有关图的邻接表文件的格式为:</b>
* </p>
* <pre>
* [Graph]
* NodeNum = 25
*
* [Nodes]
* Node0 = (1,242)
* Node1 = (0,242)(2,305)
* Node2 = (1,305)(3,397)(4,704)
* Node3 = (2,397)
* </pre>
* <p>
* <b>图中结点显示位置坐标的文件格式为:</b>
* <pre>
* 0(37,5)
* 1(34,8)
* 2(31,11)
* 3(30,14)
* 4(26,13)
* 5(26,17)
* 6(31,20)
* </pre>
* <p>
* <b>图中各结点对应名称的文件格式为:</b>
* </p>
* <pre>
* 0 (哈尔滨)
* 1 (长春)
* 2 (沈阳)
* 3 (大连)
* 4 (天津)
* 5 (徐州)
* 6 (上海)
* </pre>
* <p>
* <b>注意各文件格式必须与上述例子相同!但可以忽略空格的影响。</b>
* </p>
* @author Fe
*/
public class GraphFromFile{
/**
* 邻接表的引用,通过graphAdjList可访问整张图的所有信息。若图不存在,则graphAdjList为null。
*/
GraphAdjList graphAdjList[] = null;
/**
* 图中结点的个数。
*/
int nodeNum = 0;
/**
* 图中各结点对应的显示坐标数组。
*/
int nodePosition[][] = null;
/**
* 图中各结点对应的名称。
*/
String nodeID[] = null;
/**
* 从文件读入一张图,以及各结点显示坐标。不包括结点名称。
* @param graphAdjListFile
* 邻接链表文件名
* @param graphPositionFile
* 结点坐标文件名
*/
public GraphFromFile(String graphAdjListFile, String graphPositionFile) {
try {
getGraphAdjList(graphAdjListFile);
getGraphPosition(graphPositionFile);
} catch (IOException e) {
}
}
/**
* 从文件读入一张图,包括结点显示坐标以及每一个结点的名称。
* @param graphAdjListFile
* 邻接链表文件名
* @param graphPositionFile
* 结点坐标文件名
* @param nodeIDFile
* 结点名称文件名
*/
public GraphFromFile(String graphAdjListFile, String graphPositionFile, String nodeIDFile) {
try {
getGraphAdjList(graphAdjListFile);
getGraphPosition(graphPositionFile);
getGraphID(nodeIDFile);
} catch (IOException e) {
}
}
/**
* 返回邻接链表的引用。
* @return
* 邻接链表的引用
*/
public GraphAdjList[] getList() {
return graphAdjList;
}
/**
* 返回图中的结点数。
* @return
* 图中的结点数
*/
public int getNodeNum() {
return nodeNum;
}
/**
* 返回图中结点坐标。
* @return
* 图中结点坐标
*/
public int[][] getNodePosition() {
return nodePosition;
}
/**
* 返回图中结点名称。
* @return
* 图中结点名称
*/
public String[] getNodeID() {
return nodeID;
}
/**
* 过滤器,用于将读入文件中的空格过滤掉。
* @param tp
* 从文件读入的一行字符串。
* @return
* 返回过滤后的字符串。
*/
private static String filter(String tp) {
StringTokenizer t = new StringTokenizer(tp, " ");
String temp = "";
try {
while(true) {
temp += t.nextToken();
}
} catch (NoSuchElementException e) {
}
return temp;
}
/**
* 从文件中读入一张图的邻接链表。
* @param graphAdjListFile
* 邻接链表文件名
* @throws IOException
* 若文件读入错误,则抛出IOException。
*/
private void getGraphAdjList(String graphAdjListFile) throws IOException {
InputStream in = new FileInputStream(graphAdjListFile);
BufferedReader inReader = new BufferedReader(new InputStreamReader(in));
String temp = null;
while ((temp = inReader.readLine()) != null) {
temp = filter(temp);
if (temp.startsWith("NodeNum")) {
nodeNum = Integer.parseInt(temp.substring(temp.indexOf('=') + 1));
graphAdjList = new GraphAdjList[nodeNum];
} else if (temp.startsWith("Node")) {
int currentNode = Integer.parseInt(temp.substring(temp.indexOf('e')+1, temp.indexOf('=')));
String tp = temp.substring(temp.indexOf('(')+1, temp.lastIndexOf(')'));
StringTokenizer t = new StringTokenizer(tp, ")(");
try {
String tmp = null;
int adjNodeNum = -1;
int weight = -1;
NextAdjNode nextTemp = null;
NextAdjNode lastAdjNode = null;
boolean isFistTime = true;
while (true) {
tmp = t.nextToken();
adjNodeNum = Integer.parseInt(tmp.substring(0, tmp.indexOf(',')));
weight = Integer.parseInt(tmp.substring(tmp.indexOf(',')+1));
nextTemp = new NextAdjNode(adjNodeNum, weight);
if (isFistTime) {
graphAdjList[currentNode] = new GraphAdjList(nextTemp);
isFistTime = false;
} else {
lastAdjNode.nextNode = nextTemp;
}
lastAdjNode = nextTemp;
}
} catch (NoSuchElementException e) {
}
}
}
in.close();
}
/**
* 从文件读入图中结点显示坐标。
* @param grapPositionFile
* 结点坐标文件名
* @throws IOException
* 若文件读入错误,则抛出IOException。
*/
private void getGraphPosition(String grapPositionFile) throws IOException {
InputStream in = new FileInputStream(grapPositionFile);
BufferedReader inReader = new BufferedReader(new InputStreamReader(in));
nodePosition = new int[nodeNum][2];
String temp = null;
while((temp = inReader.readLine()) != null) {
temp = filter(temp);
int node = Integer.parseInt(temp.substring(0, temp.indexOf('(')));
nodePosition[node][0] = Integer.parseInt(temp.substring(temp.indexOf('(')+1, temp.indexOf(',')));
nodePosition[node][1] = Integer.parseInt(temp.substring(temp.indexOf(',')+1, temp.indexOf(')')));
}
in.close();
}
/**
* 从文件中读入结点对应名称。
* @param nodeIDFile
* 结点名称文件名
* @throws IOException
* 若文件读入错误,则抛出IOException。
*/
private void getGraphID(String nodeIDFile) throws IOException {
BufferedReader inReader = new BufferedReader(new FileReader(nodeIDFile));
nodeID = new String[nodeNum];
String temp = null;
while((temp = inReader.readLine()) != null) {
temp = filter(temp);
int node = Integer.parseInt(temp.substring(0, temp.indexOf('(')));
nodeID[node] = temp.substring(temp.indexOf('(')+1, temp.indexOf(')'));
}
}
}
一个用Dijkstra算法实现的路由算法的java程序——2 GraphFromFile类相关推荐
- 计算机网络网络层之路由算法3距离向量路由算法
系列文章目录 第九章计算机网络之网络层之路由算法3距离向量路由算法 距离向量路由算法 系列文章目录 三.距离向量路由算法 距离向量(Distance Vector)路由算法 Bellman-Ford举 ...
- 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )
文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...
- 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)
文章目录 0.思维导图 1.路由算法分类与路由表 2.静态路由和动态路由 3.动态路由的两种算法:链路状态路由算法和距离向量路由算法 4.层次路由 0.思维导图 1.路由算法分类与路由表 路由器转发分 ...
- java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...
设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...
- 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?
前言 不得不说,现在几乎所有的大厂,比如Google.字节.BAT,面试的时候都喜欢考算法.让人现场写代码,那你有没有真正地想过,为什么这些大公司都喜欢考算法呢? 经常有人说,程序员35岁之后很容易陷 ...
- 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例
图信息文件一 CityGraph.txt NodeNum = 25 Node0 = (1,242) Node1 = (0,242)(2,305) Node2 = (1,305)(3,39 ...
- 距离向量路由算法matlab,距离向量路由算法
mr1311:配置端口安全性有很多方法.下面描述可在Cisco交换机上配置端口安全性的方法.|@||@|静态安全MAC地址:静态MAC地址是使用switchport port-security mac ...
- 使用IDEA创建一个通过url链接生成二维码的java程序|自动生成二维码
平时使用了那么多的二维码,今天我们自己做一个二维码.今天刚安装了IDEA,学会了用法,就来通过IDEA做一个生成二维码的程序. 首先新建一个项目 设置项目名称 点击Next之后,出现下图所示页面: ...
- 今天写了一个含配置文件的 文件分割 及 合并 的java程序。
SplitFileDemo(分割)类 package Split;import java.io.File; import java.io.FileInputStream; import java.io ...
最新文章
- numpy使用[]语法索引二维numpy数组中指定指定行之前所有数据行的数值内容(accessing rows in numpy array before specifc row)
- linux flatpak 简介 同一个应用在不同linux发行版运行
- Linux下不同服务器间数据传输
- python 技术篇-使用logging日志模块自定义时间格式
- win oracle 重启命令,Windows下命令行如何启动Oracle10g?
- 你懂change buffer吗
- Java中的迭代与递归
- adb刷入第三方recovery_橙狐Recovery一款另类功能丰富的第三方刷机工具支持MIUI OTA...
- Java中如何将以byte数组给出的数据转换为double数组形式
- 网络安全分析 | 用OpenFEA定位WebShell木马后门
- 【转】Emgu 图像阈值
- 深圳的90后,是如何渡过他们的周末的?
- 一张图解释什么是遗传算法_什么是智慧水务决策支持系统?从一张图说起
- ts文件合并为MP4的方法
- 2022年全网首发|大数据专家级技能模型与学习指南(胜天半子篇)
- Fork/Join 型线程池与 Work-Stealing 算法
- 【强化学习】模仿学习:行为克隆
- RTT WK2412 spi-uart
- 处理图片有困难?分享一款在线图像处理软件给你
- msbuild ConfuserEx.Build 加密