数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)

摘要:
今天要做的最重要的事情是纠正错误,并通过添加输出语句来确定错误的来源;查找错误源:wb=newXSSFWorkbook(input)//通过在线查询发现语句创建错误为jar包问题;下图显示了poi-jar包的各种用法:(我需要excel)阅读表:importjava.io。文件输入流;importjava.io。IOException;importjava.io.InputStrea

今天做的最多的事情就是纠错了,
通过添加输出语句判断错误来源;

数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)第1张

找到错误来源:

wb = new XSSFWorkbook(input);//语句创建错误

网上查询发现是jar包的问题;

下图为poi的jar包各个用途:(本人需要的是excel)

数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)第2张

读取表格:

                                                           
                        
                        
                        


 
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;

import org.apache.poi.hssf.usermodel.HSSFCell;
import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Cell;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;
public class ExcelUtil {
    private static String substring;
    public static void main(String[] args) throws IOException{
        try {
            //输入文件名
            System.out.println("开始读入表格");
            ExcelUtil.read("D://dns.xls");
            } catch (IOException e) {
                e.printStackTrace();
                System.out.println("读入失败");
                }
        }
    public static void read(String filePath) throws IOException {
         
        //判断是xls还是xlsx
        String fileType = filePath.substring(filePath.lastIndexOf(".") + 1,filePath.length());
        InputStream input = new FileInputStream(filePath);
        Workbook wb = null;
        if (fileType.equals("xls")) {
            System.out.println("您的excel格式为.xls");
            wb = new HSSFWorkbook(input);
            System.out.println("成功读取表格");
        } else if (fileType.equals("xlsx")) {
            wb= new XSSFWorkbook(input);    
        } else {
            System.out.println("您输入的excel格式不正确");
        }
        //得到一个工作表对象;
        System.out.println("得到一个工作表对象");
        Sheet sheet = wb.getSheetAt(0);
        int rsRows = sheet.getLastRowNum();// 获取sheet表中的总行数
        // 遍历行
        System.out.println("遍历行");
        for (int i=0;i<=rsRows;i++) {
            Row row = sheet.getRow(i);
            StringBuffer sb = new StringBuffer();
            System.out.println("遍历单元格");
            //遍历单元格
            for(int j=0;j<row.getLastCellNum();j++){
                String value = null;
                Cell cell = row.getCell(j);
                //判断单元格是否为空
                System.out.println("判断单元格是否为空");
                if(cell==null||cell.equals(null)||cell.getCellType()==HSSFCell.CELL_TYPE_BLANK){//空值
                    value="null";
                }else {
                    //判断数据类型
                    switch (cell.getCellType()) {
                        case HSSFCell.CELL_TYPE_FORMULA:value = "" + cell.getCellFormula();//公式型
                        break;
                        case HSSFCell.CELL_TYPE_NUMERIC:value = "" + cell.getNumericCellValue();//数值型
                        break;
                        case HSSFCell.CELL_TYPE_STRING:value = cell.getStringCellValue();//字符串型
                        break;
                        }
                }                
                sb.append(value + " ");
                substring = sb.substring(0, sb.length()-1);
            }
        
        //转换为数组
        String[] strings = sb.toString().split(",");
        System.out.println(substring.toString());
        System.out.println("操作完成!");
        for(int a=0;a<strings.length;a++) {
            System.out.println(strings[a]);
        }
        }
    }
    
}

 后来又报错:HSSFCell.CELL_TYPE_STRING、BOOLEAN、NUMERIC无定义!

新版:

if(cell==null||cell.equals(null)||cell.getCellType()==CellType.BLANK){
                    value="null";
                }else {
                    //判断数据类型
                    switch (cell.getCellType()) {
                        case FORMULA:value = "" + cell.getCellFormula();
                        break;
                        case NUMERIC:value = "" + cell.getNumericCellValue();
                        break;
                        case STRING:value = cell.getStringCellValue();
                        break;
                        default:
                        break;
                        }
                }

 运行截图:

数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)第3张

迪杰斯特拉算法:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

public class Dijkstra{
    public static void main(String[] args) throws IOException{
         @SuppressWarnings("resource")
        Scanner sc=new Scanner(System.in);
         System.out.println("输入起点与终点:");
         int a[]=new int[2];
         for(int i=0;i<2;i++){
                a[i]=sc.nextInt();
         }
         int vs=a[0];
         int vf=a[1];
         Dijkstra.dijkstra(vs,vf);
    }
    public static  List<String>  readTxtFile(String filePath) {
        /**
         * 读取文档
         * @param filePath
         * @return
         */
                List<String> list = new ArrayList<String>();
                try {
                    String encoding = "UTF-8";
                    File file = new File(filePath);
                    if (file.isFile() && file.exists()) { 
                        InputStreamReader read = new InputStreamReader(
                                new FileInputStream(file), encoding);
                        BufferedReader bufferedReader = new BufferedReader(read);
                        String lineTxt = null;
                        while ((lineTxt = bufferedReader.readLine()) != null) {
                            if (!lineTxt.startsWith("#"))
                                list.add(lineTxt);
                        }
                        read.close();
                    } else {
                        System.out.println("找不到文件");
                    }
                } catch (Exception e) {
                    System.out.println("出错了");
                    e.printStackTrace();
                }
                return list;
          
            }
    
    
    public static String[][] createArray(String filePath){
        /**
         * 读取文档生成二维数组
         * @param filePath
         * @return
         */
            List<String> list = readTxtFile(filePath);
            System.out.println("读取成功");
            String[][] array = new String[list.size()][];
            for(int i=0;i<list.size();i++){
                array[i] = new String[list.size()];
                String linetxt=list.get(i);
                String[] myArray = linetxt.replaceAll("\s+", "@").split("@");
                for(int j=0;j<myArray.length;j++){
                        array[i][j]=myArray[j];                                        
                }
            }
            return array;
        }
    
    public static int[][] str2int(String[][] str)
    {
        int a,b;
        a = str.length;
        b = str[0].length;
        int result[][] = new int[a][b];
        for(int i = 0 ; i < a ; ++ i)
            for(int j = 0 ; j < b ; ++ j) {
                result[i][j] = Integer.parseInt(str[i][j]);
            }
                
        return result;
    }
    public static void printArray(String array[][]){//打印输出,观察二维数组是否正确;纠错用
        for(int i=0;i<array.length;i++){
            for(int j=0;j<array[i].length;j++){
                if(j!=array[i].length-1){
                    System.out.print("array["+i+"]["+j+"]="+array[i][j]+",");
                }
                else{
                    System.out.print("array["+i+"]["+j+"]="+array[i][j]);
                }
                  
            }
            System.out.println();
        }
    }
    public static void dijkstra(int vs,int vf) {
        /**
        * Dijkstra最短路径。
        * 即图中"节点vs"到其它各个节点的最短路径。
        * @param vs 起始节点
        * @param Graph 图
         */
        
        String[][] str= createArray("D:\text.txt");
        System.out.println("成功创建二维字符串数组");
         printArray(str);
        //将读取的String型二维数组转化为int型       
        int[][]Graph =str2int(str);    
        System.out.println("成功转化为整数组");
        int NUM = Graph[0].length;
        
        
        int[] prenode = new int[NUM];// 前驱节点数组
        
        
        int[] path = new int[NUM];// 最短距离数组
        
        
        boolean[] flag = new boolean[NUM];// 该节点是否已经找到最短路径
         
        int vnear = 0;//距离vs最近的节点
        
        //初始化
        for (int i = 0; i <path.length; i++) {
            prenode[i] = i;
            path[i] = Graph[vs][i];//顶点i的最短路径为顶点vs到i的权
            flag[i] = false;
        }
 
        flag[vs] = true;//vs自身初始化
        
        //遍历 Graph.length-1次,找出每个顶点的最短路径
        for (int v = 1; v < Graph.length; v++) {
            // 每次循环求得当前距离vs最近的顶点vnear和最短距离min
            int min = 100000;//100000表示无穷
            for (int j = 0; j < Graph.length; j++) {
                if (!flag[j] && path[j] < min) {
                    min = path[j];
                    vnear = j;
                }
            }
            //标记顶点vnear为已经获取到最短路径
            flag[vnear] = true;
            
            // 根据vnear更新vs到其他所有节点的前驱节点和最短路径
            for (int k = 0; k < Graph.length; k++) {
                if (!flag[k] && (min + Graph[vnear][k]) < path[k]) {
                    prenode[k] = vnear;
                    path[k] = min + Graph[vnear][k];
                }
            }
        }
          System.out.println(";总公里数=" + path[vf]);
        System.out.println("起点"+vs+"到终点"+vf+"的最短路径为:");
        System.out.print("终点<-" + vf  + "前驱" + prenode[vf]);
        //依次输出前驱
        do{
            vf=prenode[vf];
            System.out.print("<-前驱" + prenode[vf]);
        }while(prenode[vf]==vs);
       
    }
    
}

 运行截图:

数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)第4张

免责声明:文章转载自《数据结构---公交线路提示系统05(内附读取表格+迪杰斯特拉算法Java代码)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇转:Oracle 10g批量绑定forall bulk collectvertica在电信的应用下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

从零搭建 ES 搜索服务(五)搜索结果高亮

一、前言 在实际使用中搜索结果中的关键词前端通常会以特殊形式展示,比如标记为红色使人一目了然。我们可以通过 ES 提供的高亮功能实现此效果。 二、代码实现 前文查询是通过一个继承 ElasticsearchRepository 的接口实现的,但是如果要实现高亮,这种方式就满足不了了,这里我们需要通过 ElasticsearchTemplate 来完成。...

ueditor 文件上传的分析和总结

正式开始之前,先写两个常用又容易被我忘掉的文件和流相互转化的方法。 1,文件转流 FileStream fs = new FileStream(filename,FileMode.Open,FileAccess.Read); byte[] infbytes = new byte[(int)fs.Length]; fs.Read(infbytes, 0, i...

生成注册码的一种算法

public static string GetSN(string str){string strResult="";//作为返回的字符串StringBuilder sbTemp=new StringBuilder(); //生成注册码for (int i = 0; i < str.Length; i++){int tIn = str[i] % 10...

Java多线程:向线程传递参数的三种方法

在传统的同步开发模式下,当我们调用一个函数时,通过这个函数的参数将数据传入,并通过这个函数的返回值来返回最终的计算结果。但在多线程的异步开发模式下,数据的传递和返回和同步开发模式有很大的区别。由于线程的运行和结束是不可预料的,因此,在传递和返回数据时就无法象函数一样通过函数参数和return语句来返回数据。本文就以上原因介绍了几种用于向线程传递数据的方法...

java的http请求实例

package vqmp.data.pull.vqmpull.common.utils; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.http.HttpEntity; import org.springframework.http...

Spring 远程调用工具类RestTemplateUtils

Spring 远程调用Rest服务工具类,包含Get、Post、Put、Delete四种调用方式。 依赖jar <dependency> <groupId>org.springframework</groupId> <artifactId>s...