目录
3.1使用Scanner类时出现java.util.NoSuchElementException
1 实验目标
编写具有可复用性和可维护性的软件。
2 实验过程
2.1基于语法的图数据输入
虽然在实验1中也使用了正则表达式,但本次实验要求对正则表达式的使用有更深一层的理解,而且面对不同的轨道系统读入的文件也需要不同的正则表达式。
例如TrackGame:
AtomStructure:
SocialNetworkCircle
主要使用了【】和\s两种形式获取语句
2.2面向复用的设计:CircularOrbit<L,E>
设计工厂方法
public static <L,E> CircularOrbit<L,E> empty() {
return (CircularOrbit<L,E>) new ConcreteCircularOrbit<L,E>();
}返回一个空系统
2.3可复用API设计
求轨道的熵:double getObjectDistributionEntropy(CircularOrbit c)
使用公式E=-i=-p(i)lnp(i)计算熵值。其中,p(i) 是第i条轨道上的物体占总物体个数的比例。
求两点间的最短逻辑距离:int getLogicalDistance (CircularOrbit c, E e1, E e2)
使用lab2的graph求得逻辑距离。
计算两轨道物体之间物理距离:double getPhysicalDistance (CircularOrbit c, E e1, E e2)
由于实现的只有1,3,5,仅实现轨道间半径的差计算
2.4图的可视化:第三方API的复用
使用Java Swing绘制图形:
创建一个继承自JPanel的类,在该类中重写paintComponent()方法。
在paintComponent()方法中使用Graphics对象来绘制所需的图形。使用drawOval绘制同心圆,使用fillOval绘制轨道物体,使用drawString方法标注轨道物体名称(如果有的话),使用drawLine方法绘制轨道间关系。
将JPanel添加到JFrame中,并使其可见。
2.5应用设计与开发
1.TrackGame
实验难点:主要是考虑轨道的排序策略,我主要实现了三种排序方式,但是由于三种方式的比较方法不同,不能直接重写比较器方法,故选择了比价笨拙的方法:先将要排序的属性设为一个列表,再把该列表排序,使运动员列表中每个运动员的属性与之比较,,以获得正确的排序位置。
2.AtomStructure
实验难点:由于本应用不需要区分电子,所以直接使用默认的CentralObject、PhysicalObject作为中心物体和轨道物体,主要工作在于检查电子跃迁的函数是否正确工作。
3.SocialNetworkCircle
实验难点:每次增减关系,都需要重构社交圈,因为该轨道系统的轨道物体所处位置是由与中心物体的逻辑距离决定的,所以需要设置socialtie列表来记录现有的社交关系,以及时重构轨道系统。
2.6应对变化
此次实验的变化并不难以实现,但由于OCP原则,需要保证在增加新功能的同时不能更改旧有的功能。
3 遇到的其他问题与困难
3.1使用Scanner类时出现java.util.NoSuchElementException
由于主函数和调用函数都使用了in.close()造成异常,将调用函数中的in.close()删除,只在主函数中关闭,功能正常。
3.2删除轨道功能不奏效
hashmap的remove功能没有奏响,是由于Track类的hashcode方法未重写,不能判定两物体的等价。更改为取值的形式,便于HashMap进行比较和删除。