目录
2.2Re-implement the Social Network in Lab1
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;
}
}