HIT2021春软件构造Lab2学习过程&问题解决记录

本文记录了一名初学者在实验中遇到的困难,如如何在遍历Set集合时避免修改集合导致的异常,以及如何处理泛型L时的编译器警告。通过增强for循环和迭代器的对比,以及对Edge和Vertex类的具体化,分享了解决问题的方法。
摘要由CSDN通过智能技术生成

记录实验二完成过程中遇到的困难和解决办法。因为在这门课之前从来没接触过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);
    } 

这样就没有警告了。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值