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类相关推荐

  1. 计算机网络网络层之路由算法3距离向量路由算法

    系列文章目录 第九章计算机网络之网络层之路由算法3距离向量路由算法 距离向量路由算法 系列文章目录 三.距离向量路由算法 距离向量(Distance Vector)路由算法 Bellman-Ford举 ...

  2. 【计算机网络】网络层 : 路由算法 ( 路由算法分类 | 静态路由算法 | 动态路由算法 | 全局性动态路由算法 | 分散性动态路由算法 | 分层次路由选择协议 )

    文章目录 一.路由算法 二.路由算法 分类 三.静态路由算法 四.动态路由算法 五.动态路由算法 分类 六.分层次的路由选择协议 一.路由算法 路由算法 : 选择数传输的 "最佳路由&quo ...

  3. 4.2.1 路由算法与路由协议概述(静态路由和动态路由---距离-向量路由算法---链路状态路由算法、层次路由)

    文章目录 0.思维导图 1.路由算法分类与路由表 2.静态路由和动态路由 3.动态路由的两种算法:链路状态路由算法和距离向量路由算法 4.层次路由 0.思维导图 1.路由算法分类与路由表 路由器转发分 ...

  4. java输入字符串异常_设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为“XYZ”。。。...

    设计一个 Java 程序,自定义异常类,从命令行(键盘)输入一个字符串,如果该字符串值为"XYZ",则抛出一个异常信息"This is a XYZ",如果从命令 ...

  5. 金九银十面试即将到来!字节内部数据结构与算法笔记,限时上线,Java程序员们准备好了吗?

    前言 不得不说,现在几乎所有的大厂,比如Google.字节.BAT,面试的时候都喜欢考算法.让人现场写代码,那你有没有真正地想过,为什么这些大公司都喜欢考算法呢? 经常有人说,程序员35岁之后很容易陷 ...

  6. 一个用Dijkstra算法实现的路由算法的java程序——9 图信息文件示例

    图信息文件一        CityGraph.txt NodeNum = 25 Node0 = (1,242) Node1 = (0,242)(2,305) Node2 = (1,305)(3,39 ...

  7. 距离向量路由算法matlab,距离向量路由算法

    mr1311:配置端口安全性有很多方法.下面描述可在Cisco交换机上配置端口安全性的方法.|@||@|静态安全MAC地址:静态MAC地址是使用switchport port-security mac ...

  8. 使用IDEA创建一个通过url链接生成二维码的java程序|自动生成二维码

    平时使用了那么多的二维码,今天我们自己做一个二维码.今天刚安装了IDEA,学会了用法,就来通过IDEA做一个生成二维码的程序. 首先新建一个项目 设置项目名称 点击Next之后,出现下图所示页面:   ...

  9. 今天写了一个含配置文件的 文件分割 及 合并 的java程序。

    SplitFileDemo(分割)类 package Split;import java.io.File; import java.io.FileInputStream; import java.io ...

最新文章

  1. numpy使用[]语法索引二维numpy数组中指定指定行之前所有数据行的数值内容(accessing rows in numpy array before specifc row)
  2. linux flatpak 简介 同一个应用在不同linux发行版运行
  3. Linux下不同服务器间数据传输
  4. python 技术篇-使用logging日志模块自定义时间格式
  5. win oracle 重启命令,Windows下命令行如何启动Oracle10g?
  6. 你懂change buffer吗
  7. Java中的迭代与递归
  8. adb刷入第三方recovery_橙狐Recovery一款另类功能丰富的第三方刷机工具支持MIUI OTA...
  9. Java中如何将以byte数组给出的数据转换为double数组形式
  10. 网络安全分析 | 用OpenFEA定位WebShell木马后门
  11. 【转】Emgu 图像阈值
  12. 深圳的90后,是如何渡过他们的周末的?
  13. 一张图解释什么是遗传算法_什么是智慧水务决策支持系统?从一张图说起
  14. ts文件合并为MP4的方法
  15. 2022年全网首发|大数据专家级技能模型与学习指南(胜天半子篇)
  16. Fork/Join 型线程池与 Work-Stealing 算法
  17. 【强化学习】模仿学习:行为克隆
  18. RTT WK2412 spi-uart
  19. 处理图片有困难?分享一款在线图像处理软件给你
  20. msbuild ConfuserEx.Build 加密

热门文章

  1. Java使用itext生成PDF 然后将多个PDF打包zip下载
  2. 计算机硬件音频,浅析计算机硬件基础 第9章(音频和视频设备).ppt
  3. 电销机器人是如何获客的?
  4. 【历史上的今天】3 月 15 日:世界上第一个互联网注册域名;Adobe 并购 Aldus;Skype 取代 MSN
  5. HoloLens开发(配置)
  6. hive 修改表结构
  7. 从FC到Wii 24年来游戏机CPU发展历程回顾
  8. 头条一面:亿级数据怎么统计?
  9. .net c# 修改视频md5
  10. EtherCAT通信DS402协议----PDO映射