哈工大2023软件构造lab2实验经验总结

目录

1 实验目标概述

2 实验过程

2.1Poetic Walks

2.2Re-implement the Social Network in Lab1

3 遇到的其它问题与总结


1 实验目标概述

训练抽象数据类型(ADT)的设计、规约、测试,并使用面向对象编程(OOP)技术实现 ADT。

2 实验过程

2.1Poetic Walks

主要任务:使用边和点两种实现Graph抽象类,理解泛型的使用并使用词料库生成诗句。

实验难点:

1.为每个ADT设计Abstraction function,Representation invariant,Safety from rep exposure。根据表示对不同的ADT设计表示不变量,并在每个函数结束时用checkRep()检查不变量,并且证明表示的安全性。

2.编写测试类,为每个函数设计测试函数,以保证ADT的正确性。

3.泛型的使用,在类和函数使用时,泛型应标注在不同的位置。

2.2Re-implement the Social Network in Lab1

主要任务:使用3.1中写出的图重新实现在lab1中的人际关系图,使用ConcreteVerticesGraph<Person>作为图的基础,使用队列寻找最短距离。

实验难点:选择寻找最短路径的方法。

public int getDistance(Person person1, Person person2) {
		if (person1.equals(person2))
			return 0;
        Queue<Person> queue = new LinkedList<>();
        Map<Person, Integer> distant = new HashMap<>();
        queue.add(person1);
        distant.put(person1, 0);
        while (!queue.isEmpty()) {
            Person head = queue.poll();
            int nowDistant = distant.get(head);
            Set<Person> friends = graph.targets(head).keySet();
            for (Person person : friends){
                if (!distant.containsKey(person)) {
                    distant.put(person, nowDistant + 1);
                    queue.offer(person);
                    if (person.equals(person2))
                        return distant.get(person2);
                    }
                }
            }
        return -1;
	}

3 遇到的其它问题与总结

在实现图边的去除使出现异常。

查阅资料后发现使用迭代器遍历列表时必须以迭代器作为删除对象。

错误代码:

for a in list{
    a.remove()
}

正确代码:

Iterator<Edge<L>> iter = edges.iterator();
		while (iter.hasNext()) {
			Edge<L> edge = iter.next();
			if (edge.getSource().equals(source) && edge.getTarget().equals(target)) {
				int oldweight = edge.getWeight();
				iter.remove();
				if(weight != 0) {
					edges.add(new Edge<>(source,target,weight));
				}
				checkRep();
				return oldweight;
			}
		}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值