哈工大软构实验lab2之Poetic Walks实现思路

Poetic Walks

该任务主要分为两部分,第一部分是使用两种实现方法实现一个图,第二部分就是使用设计好的图来实现一个单词插入的功能

Get the code and prepare Git repository

在网站上获得源代码,按照实验要求更改正确的项目结构,而后按照lab0和lab1的步骤上传git。

Problem 1: Test Graph <String>

目前在这一步只需测试带有String类型顶点标签的图。

对Graph.empty()静态方法的测试在GraphStaicTest.java中,已经给出,不做改变。

在GarphInstanceTest.java中,对实例方法的测试首先使用emptyInstance()方法创建一个空图,接下来对Graph接口中的各个方法进行输入并测试。其中对起始空点的测试testInitialVerticesEmpty()已经在GraphInstancesTest.java文件中给出。

为了保证测试的完整性,用于测试的顶点需要有一部分存在于图中,另一部分不存在于图中。用于测试的边需要有如下三组:“两点存在”、“只有一点存在”和“两点不存在”以及特殊的:“边权为0”

接下来对每个Graph接口提供的add(), remove(), set, sources, targets, vertices()等方法设计数据进行测试。

Problem 2: Implement Graph <String>

实现两种构建图的方法:分别是以边构造和以点构造。下面将分类叙述。

  1. Implement ConcreteEdgesGraph

这一部分主要实现用边构造一个图。

首先实现edge类,该类有起始,终点,权重三个参数,并且有四个方法(方法不展示)

然后我们继续实现concrete,首先定义点vertices和边edges。RI要求边两端顶点都存在,且边权大于零。

而后挨个实现方法。

add(L vertex):遍历vertices集合,查找有无与点vertex相同的点即可。有则返回false不做操作;无则在vertices集合中添加点vertex,返回true;

set(L source, L target, int weight):该方法主要分三种操作:修改已有的边,移除已有的边,添加新的边。遍历edges集合,若存在边起点终点相同,则将该边权值修改为weight,返回原权值,weight为0则代表删除该边;若不存在,则判断weight的值是否为0,不为0,则添加该边至edges集合中,将不起点终点添加到vertices集合中,返回0,否则不做操作,返回0。

remove(L vertex): 将edges集合中所有以vertex为起点或终点的边全部删除,删除成功返回true。

vertices():返回由图的顶点构成的集合即可。

sources(L target):返回所有直接指向target的点以及与之对应的边的权值。遍历edges集合寻找所有以target为终点的边并将其起点作为键名、边权作为键值添加到Map中,返回该Map。

targets(L source):返回所有source直接指向的点以及与之对应的边的权值。遍历edges集合寻找所有以source为起点点的边并将其终点作为键名、权值作为键值添加到新生成的Map中,最后返回该Map即可。

toString():将图的所有信息打印出来,即所有的点与边的信息。

​​​​​​​     2.  Implement ConcreteVerticesGraph

类似上一问,这里以点为基础构造图。

首先构造Vertex类,该类有三个参数(如AF)以及八个方法。

需完成Vertex类中各个变量的观察器:返回点的名称、源点集、终点集。

SetTarget:在targetsMap中加入节点。若weight不为0,则将其加入targets中(若终点已存在,则更新其weight并返回原weight,不存在则直接构建新点并返回0);若weight为0,则移除target节点(不存在返回0,存在返回原weight);若weight小于0,则返回-1并输出“weight小于0,错误”

Setsource:在sourcesMap中加入节点,若weight不为0,则将其加入sources中(若终点已存在,则更新其weight并返回原weight,不存在则直接构建新点并返回0);若weight为0,则移除source节点(不存在返回0,存在返回原weight);若weight小于0,则返回-1并输出“weight小于0,错误”

然后我们继续实现concrete,首先定义点集vertices和边edges。RI要求不存在重复点。而后挨个实现方法:

add(L vertex):遍历vertices集合,查找有无与点vertex相同的点。若存在,则返回false;不存在,则在vertices集合中添加点vertex,返回true;

set(L source, L target, int weight):该方法主要分三种操作:修改已有的边,移除已有的边,添加新的边。首先若边权大于0,则将起点终点加入集合,否则报错。而后遍历vertices集合,找到源点,对其终点集中进行setTargets操作;找到终点,对其源点集进行setSources操作。

remove(L vertex):在vertices集合中若找到vertex点,将vertex从vertices集合中其他点的源点集与终点集中去除,在vertices集合中删除vertex并返回true;若未找到,返回false。

vertices(): 返回由图的顶点构成的集合即可。

sources(L target):返回target点的源点集即可。

targets(L source):返回source点的终点集即可。

toString():将图的所有信息打印出来,即所有的点与边的信息。

Problem 3: Implement generic Graph<L>

  1. Make the implementations generic

将String实现的类改成泛型L,将出现的报错修改(从只适用于String的一些方法修改为通用的方法)

​​​​​​​     2. Implement Graph.empty()

任意调用一个生成图的方法生成一张空图即可

​​​​​​​Problem 4: Poetic walks

这一部分要求运用之前构建的graph等生成一个语句扩充程序

  1. Test GraphPoet

设计测试样例的时候分以下三类:从文本结构来分:空文本、单行文本、多行文本。设计完测试样例后再将结果与程序运行结果比较。

     2. Implement GraphPoet

    首先读入语料库的文本并处理。在处理的时候使用一个Map来统计每一个字符对(相邻的两个字符组成一个字符对)的出现次数,同时将读入的语料库作为一个List备用。

    而后实现主体功能。建立一个StringBuilder来存储最后需要返回的文本。每次循环的时候都加入一个原有的文本,并根据原有文本的当前字符与下一个字符遍历比较在语料库中是否存在一个字符能连接两个字符,如果存在的话加入,如果存在多个的话选择在语料库中出现次数最多的那个字符,最终返回一个String。

注:P2部分类似lab1,有了我们P1的程序,复用之后P2会变得美观且严谨。不做叙述。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值