软件构造3——lab2实验心得1

老套路,先分享一下我在完成这次P1的时候查的资料:
Java如何做到全面的Safety from rep exposure?:
https://blog.csdn.net/djd566/article/details/79749757
Java中List集合的三种遍历方式(全网最详):
https://www.cnblogs.com/lianoulay/p/8849747.html
正确删除list的元素:
https://blog.csdn.net/xingxiupaioxue/article/details/79387872
java笔记–Map的用法:
https://blog.csdn.net/qq_29373285/article/details/81487594
【Java】如何清空Map:
https://blog.csdn.net/TsuiXh/article/details/87879004
java中map的遍历:
https://blog.csdn.net/weixin_40867255/article/details/83142021
java中Map遍历的四种方式:
https://www.cnblogs.com/damoblog/p/9124937.html
Map集合的四种遍历方式:
https://www.cnblogs.com/blest-future/p/4628871.html
Java根据条件删除Map中元素:
https://blog.csdn.net/yangfeisc/article/details/41926229
java.util.Collections.unmodifiableSet()方法实例:
https://www.cnblogs.com/sharpest/p/8434470.html
java字符串连接:
https://blog.csdn.net/qincidong/article/details/82526444
Java中hashcode的理解:
https://www.cnblogs.com/zhchoutai/p/8676351.html
JAVA 一个或多个空格分割字符串:
https://www.cnblogs.com/huangxiaowu/p/6409328.html
String、StringBuffer和StringBuilder的区别:
https://blog.csdn.net/csxypr/article/details/92378336
StringBuilder类的常用方法 增删改查、反转、互转:
https://blog.csdn.net/xyphf/article/details/78209289
StringBuilder类型与String类型相互转换:
https://blog.csdn.net/qq_42174554/article/details/80656135
断言 Assert.assertEquals():
https://blog.csdn.net/Ruby_One/article/details/84674754

感谢前面的大佬为我这次lab2P1提供的资料!!!膜拜!!!

1.1 Poetic Walks
http://web.mit.edu/6.031/www/sp17/psets/ps2/
类ConcreteEdgesGraph,ConcreteVerticesGraph是用来实现Graph这个接口的,在这两个类里面我们分别要用两种不同的方式实现Graph中的抽象函数。最后我们需要在Poet中利用已经写好的接口实现文章补全这种功能。
1.1.3.1 Implement ConcreteEdgesGraph
1.1.3.1.1 ConcreteEdgesGraph类
1.1.3.1.1.1 Abstraction function,Representation invariant,Safety from rep exposure
Abstraction function:
graph中有点和边,边是有向带权重的
Representation invariant:
n个点最多有n(n-1)条有向边
Safety from rep exposure:
将类中所有的属性(变量)定义为private类型;方法或者返回immutable data,或者返回本应该返回的mutable data的副本,或者返回一个不可修改的mutable data
1.1.3.1.1.2 constructor
感觉上是啥也不用写的,就释放一个空的构造函数在那就行
1.1.3.1.1.3 checkRep()
注意这个是有向图,所以图中有一个固定的关系就是e<=n(n-1),所以我们只要比较一下点的个数和边的个数就好了
1.1.3.1.1.4 add(String vertex)
添加点的时候,如果这个点已经在图中了,我们就不用填加了,否则我们才需要将点放在图中。
1.1.3.1.1.5 set(String source,String target,int weight)
为了程序的健壮性,我们首先应该进行异常值的处理:如果输入的source==target那么就直接返回-3,输入负数,直接返回-1; 然后再讨论weight是正数和0的情况:如果weight是0,我们应该先在图中找这样的边,如果能找到,我们就删除这条边并且返回原来的weight,如果找不到,我们就直接返回-2; 如果weight是正数,我们就直接将这两个点先加到图中,然后我们再看图中是否已经有这条边,如果已经有这条边了,那我们就应该修改这条边的weight,然后返回原来的weight,否则就是要新增一条边,我们就直接在图中加一条边就好了。
1.1.3.1.1.6 remove(String vertex)
移除的时候先要看点是不是在图中,如果这个点不在图中我们就应该直接返回false,否则如果在图中,就把他删掉,并且将所有的从vertex发出的边和连接到vertex的边都删了。
1.1.3.1.1.7 vertices()
这个就是让返回顶点的集合,但是,我们返回的应该是immutable的类型的
1.1.3.1.1.8 sources(String target)
当Target这个值相等的时候,我们那就将这个键值对放到map中
1.1.3.1.1.9 targets(String source)
当source这个值相等的时候,我们那就将这个键值对放到map中
1.1.3.1.1.10 toString()
当没有边的时候,就应该返回一条提示"这个图没有边",否则就应该把每一条边的toString都连在一起,一块返回
1.1.3.1.2 Edges类
1.1.3.1.2.1 Fieldsprivate String source;private String target;private int weight;
1.1.3.1.2.2 Abstraction function,Representation invariant,Safety from rep exposure
Abstraction function:
有向带权边必须要有两个顶点和方向还有权重
Representation invariant:
边的定点不能是空字符串,权重不能是负数,source不能等于target
Safety from rep exposure:
将类中所有的属性(变量)定义为private类型;方法或者返回immutable data
1.1.3.1.2.3 constructor
应该有source,target,weight的赋值
1.1.3.1.2.4 checkRep
source和target不能是null,weight不能<=0,source跟target不能相等,不能有自己指向自己的边
1.1.3.1.2.5 get和set方法
get方法就是返回每一个属性的值,set方法是重新设置权重
1.1.3.1.2.6 toString()
这个就是把这条边按照source->target:weight的形式返回
1.1.3.1.2.7 equals(Edge a)
判断两条边是否相等,就是判断source,target,weight是否分别都相等
1.1.3.1.2.8 hashCode()
前面关于hashCode的文章链接里面有这个公式,这里就不重复了。
1.1.3.1.3 ConcreteEdgesGraphTest
测试没有边的时候的情况 :
测试add这个方法:
测试向图中加入新的点
测试向图中加入已经有的点
测试set这个方法:
输入的权重是负数的时候应该返回-1 ;weight>0,如果找不到原来的边,就加一条,并且返回0 ;weight>0,如果找的到就修改边,然后返回原来边的权重 ;weight=0,如果找不到边,直接退出返回-2 ;边的source=target就返回-3 ;weight=0,如果找的到边,就删除这条边
测试remove这个方法:
如果删除的不是图中的点,应该返回false 如果删除的是图中的点,应该返回true 看能不能正确的返回一个集合
测试sources和targets两个方法 :
1.1.3.1.4 EdgesTestCheckReptest
测试weight=-1/0时checkRep返回false;
测试source和target相等时checkRep返回false;
测试正常情况下应该返回true;
测试getSource和getTarget方法;
测试set方法;
测试toString方法;
测试Equals方法:
跟别的边相不相等;
跟自己相不相等;
测试hashCode的数值对不对 ;
1.1.3.2 Implement ConcreteVerticesGraph
由于这个类的实现跟上一类的实现思路几乎一摸一样,区别在于这次是点中存储边,所以在source和target中有些区别,但是思路都是一样的,把上一个的测试放到这也同样适用
1.1.4 Problem 3: Implement generic Graph
1.1.4.1 Make the implementations generic
先将这两个类改成这样
public class ConcreteEdgesGraph implements Graph { … }
class Edge { … }
public class ConcreteVerticesGraph implements Graph { … }
class Vertex { … }
将所有的String都改成L,List改成List<Edge>
把所有的new ConcreteEdgesGraph()和new Edge()改成new ConcreteEdgesGraph() and new Edge()
这个无脑改就行,但是要改到最后一个warning都没有,同时程序中不能添加@SuppressWarnings这种文字来避免warning。
1.1.4.2 Implement Graph.empty()
完成Graph.empty()这个方法,就是任选一个类实现这个接口,改一改上面的那个方法就行了。
1.1.5 Problem 4: Poetic walks
1.1.5.1 Test GraphPoet
输入input,然后在从文件中读取poet,调用Graph.poem之后看是否相等
1.1.5.2 Implement GraphPoet
1.1.5.2.1 Fields
设置的必须都是private的
1.1.5.2.2 Abstraction function,Representation invariant,Safety from rep exposure
Abstraction function:
将文件中的单词变成有向图
Representation invariant:
输入的文本不能是空,有向图不能是null
Safety from rep exposure:将类中所有的属性(变量)定义为private类型;方法或者返回immutable data,或者返回本应该返回的mutable data的副本,或者返回一个不可修改的mutable data
1.1.5.2.3 GraphPoet(File corpus) throws IOException
这个就直接把文件一个单词一个单词读进去,注意要把所有的字母变成统一的形式(都是大写或者都是小写)
1.1.5.2.4 checkRep()
初始的文档不能是空的
1.1.5.2.5 poem(String input)
找到前面的点的target和后面的点的source,看有没有公共的元素,如果有就把这个公共的元素插入到outputString里
1.1.5.2.6 toString()
就是直接返回graph的toString方法
1.1.5.3 Graph poetry slam
把测试样例过了就行了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值