记录实验二完成过程中遇到的困难和解决办法。因为在这门课之前从来没接触过Java编程,所以很多东西从头学起,主要是对自己的学习过程做个记录。
(1)关于遍历Set集合时的修改问题
for(Vertex<L> temp : vertices)
{
if(temp.getname().equals(vertex))
{
vertices.remove(temp);//删除对象本身
judge = true;
}
}
查阅资料后采用了增强for循环的形式遍历(同时了解到还可以使用迭代器,如果遍历List集合,因为是有序集合,可以使用位置参数遍历、增强for循环遍历和迭代器遍历),静态检查没有错误,但实际运行test时运行到这一步却会抛出异常。
实际上在使用增强for循环遍历时,是不能对正在遍历的集合进行修改的。因为上面的循环体中存在对集合元素的删除操作,修改了集合,再遍历时就会出错。所以最后修改的代码为:
for(Vertex<L> temp : vertices)
{
if(temp.getname().equals(vertex))
{
vertices.remove(temp);//删除对象本身
judge = true;
break;
}
}
根据我的代码需求可以在删除元素后立刻终止循环,但有个问题,就是不能处理需要一次性删除多个元素的情况。参考了网上其他人的处理方式,了解到使用迭代器遍历就不会有这种问题了。所以可以根据需要调整遍历方法。
(2)使用泛型L时编译器的警告问题
在实现Edge类和Vertex类时,根据实验要求进行泛型化。但此时对应的test中会报出这样的警告:
问题代码是这样的:
@Test
public void testweight() {
Edge test = new Edge("a","b",3);//警告出现处
assertEquals(test.weight(),3);
}
后来查阅资料发现是需要在这里对未指定的Edge类型进行具体化,如进行以下更改:
@Test
public void testweight() {
Edge<String> test = new Edge<String>("a","b",3);
assertEquals(test.weight(),3);
}
这样就没有警告了。