Lab_2实验总结(软件构造)
1.1 Poetic Walks
用两种方法实现Graph类用来存储加权有向图,并使用Graph类来在输入的每个单词之间从语料库中找出权重为2的单词插入实现诗意漫步。
1.1.1 Get the code and prepare Git repository
直接从GitHub下载zip格式的任务代码,用GitHub的本地应用创建并管理本地开发
1.1.3 Problem 2: Implement Graph <String>
1.1.3.1 Implement ConcreteEdgesGraph
Vertices用于保存所有的顶点,而类Edge用from、to、weight来表示一个有向边的起点、终点与权重,edges是类Edge的List,用来保存所有边。由此来完成了所有的功能。
1.1.3.2 Implement ConcreteVerticesGraph
类Vertex有v来表示顶点名称,edge是一个Map,用来保存由v的所有边与权重。Vertices便是Vertex的List,这样就能构成一个有向图,由此完成所有功能。
1.1.4 Problem 3: Implement generic Graph<L>
1.1.4.1 Make the implementations generic
在ConcreteVerticesGraph和ConcreteEdgeGraph后加入<L>来使用泛型,并将每个涉及的String变量全部改为L,包括在Vertex和Edge类里的所有String类型变量和Map<String,Interger>里的String全部改为L即可。
1.1.4.2 Implement Graph.empty()
我选用ConcreteVerticesGraph<L>作为我的Graph<L>的具体实现。
1.1.5 Problem 4: Poetic walks
1.1.5.1 Test GraphPoet
1.1.5.2 Implement GraphPoet
先从corpus文件里读入所有单词,并构建加权有向图。
接着在方法poem里读入控制台输入input,并通过‘ ’分离每个单词读入到数组中(在这里我将所有单词全部变成小写)。然后将输入的每个单词与语料库中的每个单词进行比对,如果这个单词与输入的相邻的俩个单词距离都为一,就将其插入到结果中,等待遍历完以后一并输出。
1.1.5.3 Graph poetry slam
语料库如下
输入如下
输出如下
1.2 Re-implement the Social Network in Lab1
要复用已经写好的类在这个任务的实现中,我选择使用的FriendshipGraph类是继承ConcreteVerticesGraph类实现的。在确定复用代码之后,其主要的问题就是如何合理的使用已有的类。比如在搜集两个人的最短距离的时候,我用已有的Graph接口中给出的targets函数来寻找邻接的节点。这样就可以在尽量多的使用已有代码和尽可能不改变已有的Main客户端的要求下实现P2。
1.2.1 FriendshipGraph类
直接从ConcreteVerticesGraph继承的类。
addVertex方法是从Person类中提取名称,然后再调用add()方法将点加入。
addEdge方法即从Person类中提取名称,然后再调用set()方法将边加入。
getDistance方法中每条边的长度都是单位长度,直接使用BFS算法即可解决。
1.2.2 Person类
Person类用于描述每个成员的姓名,方法主要就是从此类中获取String类型的姓名,由此创建了getName()方法。
1.2.3 客户端main()
1.2.4 测试用例
尝试编了一些用例。
1.2.5 提交至Git仓库
如何通过Git提交当前版本到GitHub上你的Lab2仓库。
项目的目录结构树状示意图。