随着华为2019年软挑的开启,我正式开启了菜鸟打比赛模式。
2019年华为的赛题个人感觉出的特别好,好到我一点头绪赌没有。不过这个赛题特别符合现在智能驾驶这个主题。不过华为这个确实站的角度相对高点,以前看到的大部分相关信息主要是讨论智能驾驶车辆采用图像传感等模式去规避其它物体,而华为软挑确实去调度整个城市的汽车。可想而知,这和阿里近些年推行的智慧城市遥相辉映。我想未来的智慧城市可能不仅仅是体现在衣、食,也应该体现在人们的住(智能家居)、行(智能驾驶)方面。
说实话,我第一次看见这个赛题介绍的开头时,居然觉得不是很难。不就是先读取三个TXT文件,然后把TXT写入到数组(数组链表、或者MAP)中,然后在创建根据roadList(路数组链表)创建图,最后把carList(车数组链表)中的节点car利用最短路径算法去搜索图不久可以了吗,看来大奖非我莫属——手动滑稽,勿喷。
直到我继续看到下面的介绍时,才发我真符合那就经典名句——“Too young too simple to naive”。如果不是实验室成员执意要参赛,我都要放弃了。尽管到现在也没有什么好的想法,不过也算是巩固了下自己所学习的知识。
好吧,废话不说了,直接先上代码(嘿嘿-其实只是读取文件的代码)。
1 package huawei; 2 3 import java.io.BufferedReader; 4 5 import java.io.FileReader; 6 import java.io.IOException; 7 8 import java.util.ArrayList; 9 import java.util.List; 10 11 import java.util.regex.Matcher; 12 import java.util.regex.Pattern; 13 14 15 /** 16 * 逐行读取txt文件并写入到list实体类中 17 * 18 * @author Bob 19 * 20 */ 21 public class car_input{ 22 23 24 public static List<car_Node> read_Car() throws IOException { 25 26 String pathname = "C:\\Users\\11940\\Desktop\\1-map-training-2\\car.txt"; 27 FileReader reader = new FileReader(pathname); 28 BufferedReader br = new BufferedReader(reader); 29 String carLine = null; 30 int carNum = 0; 31 List<car_Node> carList = new ArrayList<car_Node>(); 32 while ((carLine = br.readLine()) != null) { 33 if (!carLine.contains("#")) { 34 //System.out.println(carLine); 35 // System.out.println("进来了"); 36 37 38 Pattern car_p = Pattern.compile("[0-9A-Z]+"); 39 Matcher car_m = car_p.matcher(carLine); 40 String[] strCarNode = new String[5]; 41 int[] intCarNode=new int[5]; 42 // int index = 0; 43 // while (m.find()) { 44 // //System.out.println(m.group()); 45 // strCarNode[index++] = m.group(); 46 // intCarNode [index++] = Integer.parseInt(strCarNode[index++]); 47 // } 48 for (int i = 0; car_m.find()&&i < strCarNode.length; i++) { 49 strCarNode[i] = car_m.group(); 50 intCarNode [i] = Integer.parseInt(strCarNode[i]); 51 //System.out.println(intCarNode[i]); 52 } 53 car_Node car = new car_Node(intCarNode[0],intCarNode[1],intCarNode[2],intCarNode[3],intCarNode[4]); 54 System.out.println(car); 55 carList.add(car); 56 carNum++; 57 } 58 59 } 60 61 //System.out.println("读取总条数:" + count + "||读取的list的长度" + list.size()); 62 63 // System.out.println(carList); 64 65 66 // for (int i = 0; i < 1000; i++) { 67 // System.out.print(carList.get(i).id); 68 // System.out.print(carList.get(i).from); 69 // System.out.print(carList.get(i).to); 70 // System.out.print(carList.get(i).speed); 71 // System.out.println(carList.get(i).planTime); 72 // 73 // 74 // } 75 76 return carList; 77 78 } 79 // public static void main(String [] args) { 80 // try { 81 // read_Car(); 82 // } catch (IOException e) { 83 // // TODO Auto-generated catch block 84 // e.printStackTrace(); 85 // } 86 // } 87 88 public static class car_Node { 89 private int id; 90 private int from; 91 private int to; 92 private int speed; 93 private int planTime; 94 95 96 public car_Node(int id, int from, int to, int speed, int planTime) { 97 this.id = id; 98 this.from = from; 99 this.to = to; 100 this.speed = speed; 101 this.planTime = planTime; 102 103 } 104 105 public int getId() { 106 return id; 107 } 108 109 public void setId(int id) { 110 this.id = id; 111 } 112 113 public int getFrom() { 114 return from; 115 } 116 117 public void setFrom(int from) { 118 this.from = from; 119 } 120 121 public int getTo() { 122 return to; 123 } 124 125 public void setTo(int to) { 126 this.to = to; 127 } 128 129 public int getSpeed() { 130 return speed; 131 } 132 133 public void setSpeed(int speed) { 134 this.speed = speed; 135 } 136 137 public int getPlanTime() { 138 return planTime; 139 } 140 141 public void setPlanTime(int planTime) { 142 this.planTime = planTime; 143 } 144 145 public String toString() { 146 147 return "car_Node [id=" + id + ", from=" + from+", to=" + to + ", speed=" + speed+ ",planTime=" + planTime 148 + "]"; 149 } 150 151 }}
1) 输入输出流
String pathname = "C:\\Users\\11940\\Desktop\\1-map-training-2\\car.txt";
FileReader reader = new FileReader(pathname);
BufferedReader br = new BufferedReader(reader);
这里我主要是创建一个FileReader对象将文件读取出来。
其实读取字符有两种方式,除了FileReader类以外,还有FileInputStream类。那么它们之间有什么联系(区别)呢?
FileReader此类的构造方法假定默认字符编码和默认字节缓冲区大小都是适当的。FileReader 用于读取字符流。要读取原始字节流,请考虑使用 FileInputStream。
FileInputStream 从文件系统中的某个文件中获得输入字节。哪些文件可用取决于主机环境。FileInputStream 用于读取诸如图像数据之类的原始字节流。要读取字符流,请考虑使用 FileReader。
对比文档我们可以得出结论:FileReader用于字符流, FileInputStream用于字节流。这两种方法其实差不多,都是从文件中写入数据或读出数据,区别就是字节流是以字节为单位进行操作的,而字符流是以字符为单位进行操作的(一个英文字母占一个字节,一个中文汉字占两个字节,而一个英文字母与一个中文汉字我们都称之为一个字符)。
2)正则表达式
我把每一行读取出来后,发现字符流是(10005, 98, 1, 6, 44)的,需要把车赋予各个属性的话就必须把这些数字分别读取出来。
于是我采用正则表达式,以下是摘自API。
通过调用模式的 matcher 方法从模式创建匹配器。创建匹配器后,可以使用它执行三种不同的匹配操作:
matches 方法尝试将整个输入序列与该模式匹配。
lookingAt 尝试将输入序列从头开始与该模式匹配。
find 方法扫描输入序列以查找与该模式匹配的下一个子序列。
每个方法都返回一个表示成功或失败的布尔值。通过查询匹配器的状态可以获取关于成功匹配的更多信息。
(https://baike.baidu.com/item/%E6%AD%A3%E5%88%99%E8%A1%A8%E8%BE%BE%E5%BC%8F/1700215?fr=aladdin)