今天用这个代替课程设计日志了,因为今天这个真的算是自己历史上第一次解决了一个项目中重要的问题,经过了自己的手而解决其问题。首先阐述下解决的问题:
这是一个商品销售类中,在这里展示的是其中主要的三个属性,现在看到的就是从数据库里面得到的表单,暂时没有经过任何排序。而计划的点击事件就是,响应按货物数量排序下面就显示售货数量从小到大排序,同理售货总额也一样。
开始时,在前天的日志里面也说了,通过销售类链接接口Comparable<>,在类里面重新定义compareTo,详见前天日志。
而后来发现的问题就是,商品id在表单里面有重复的,因为是不同时间段卖出的商品。而collections.sort()是对全list里面的每个类进行排序的。所以得重新对表单进行遍历,有相同的id的类要合并在一起。最后再排序,这才是我们想要的结果。
首先迭代器又是首选,因为已经需要对类里面的个别属性进行操作。在网上看到肯定需要遍历,所以这次解决这个问题把迭代器和集合的遍历用在了一起。这也是至今课设为止的最大亮点。至少对我来说是这样的。
List<sale> stuList =new saleSrv().FetchAll(); //从数据库获得信息
Iterator<sale> it=stuList.iterator(); //使用迭代器,开始依次从头开始遍历
int j=0,k=0; //j,k 是对后面比较元素的位置控制,k进一步讲就是调整while循环一次后再次比较的位置
while (it.hasNext()){ //下面注意看,有好多syso,就是实时追踪比较位置的挺实用的小技巧
sale sa=it.next();
String temp=sa.getGoodsID();
int te=sa.getNumber();
double t=sa.getOrdersum();
System.out.println(temp);
for (int i=j+1,len=stuList.size();i<len;i++){ //遍历开始一一比较
System.out.println("Len:"+len);
System.out.println("i:"+i);
System.out.println("比较:"+stuList.get(i).getGoodsID());
if ((stuList.get(i).getGoodsID()).equals(temp)){ //如果id相同
System.out.println("i="+i);
stuList.get(i).setNumber(te+(stuList.get(i).getNumber()));
System.out.println(sa.getNumber());
stuList.get(i).setOrdersum(t+(stuList.get(i).getOrdersum()));
System.out.println(sa.getOrdersum());
it.remove();
len--;
i--;
k++;
}
}
j=j-k;
j++;
k=0;
System.out.println("j="+j);
}
SortListUtil.sort(stuList, "Ordersum",null);
以上就是最主要的代码,可以在SortListUtil.sort里定义一个属性进行排序。
以上过程中遇到的一个大问题就是,在if条件语句里面,开始我用到了List里面的remove()。结果发生错误了。在网上学习才明白了是怎么回事。
用我现在知道的就是,迭代器在一开始定义后获取List里面的东西后,不能对里面的东西进行改变,不然迭代器就会迷路啊,迷失自己,感觉身体被掏空而不能工作。
后来又在网上看到了另一个方法:
把找到的,需要删除的先放到一个暂时定义List的temp里面,在最后用removeAll()将temp从主List里面除去。可能我的问题就是在于我的List<?>的<?>是类,解决了半天也没成功。
不过这个方法真的可以get到。
终于还是在迭代器这里做文章,迭代器的remove可以删除内容而没有影响。你想想,这是你自己不要身体内的东西咯,自己是知道的,所以功能可以实现。反之真的被动的失去身体内的东西,那确实是应该发疯。
最后想说明的是代码里面的j,k:就是对删除元素后,遍历和比较的位置会改变,所以需要来指定正确的位置。
解决出来这个问题,真的是很好的一种感觉。大概就是这条路吸引很多人的本质吧。