帮忙看看下面这短代码,小弟已经晕了!
Dao层如下:
public List<Object[]> get_collect_message(String plantype) {
String hql="select isi,sum(isi.tounumber) as tounumber,max(isi.rukutime) as rukutime
from InStoreInfo as isi where isi.plantype=? and isi.isAgree !=0 and isi.inuse=0
group by isi.plancode order by rukutime desc";
Query query=sf.getCurrentSession().createQuery(hql);
query.setParameter(0, plantype);
return query.list();
}
Service如下:
public List<RuLanCollectMessage> get_collect_message(String plantype) {
List<Object[]> list=storeDao.get_collect_message(plantype);
System.out.println(list.size());//取得list.size()=2
List RLCMList=new ArrayList();
RuLanCollectMessage ruLanCollectMessage=new RuLanCollectMessage();//自定义的一个类
for(int i=0;i<list.size();i++){
Object[] obj=list.get(i);//得到索引为i的那条记录
InStoreInfo isi=(InStoreInfo) obj[0];//obj[0]是一个InStoreInfo对象
ruLanCollectMessage.setPlancode(isi.getPlancode());
System.out.println(isi.getPlancode());//输出 20120728,022
ruLanCollectMessage.setGuocode(isi.getGuocode());
ruLanCollectMessage.setLasttime((Date)obj[2]);
Long l=(Long)obj[1];
ruLanCollectMessage.setInputAllDateTou(l.intValue());
RLCMList.add(ruLanCollectMessage);
for(int y=0;y<RLCMList.size();y++){
RuLanCollectMessage r=(RuLanCollectMessage)RLCMList.get(i);
System.out.println(r.getPlancode());
}
}
return RLCMList;
}
在下面的循环语句处我输出System.out.println(r.getPlancode());
控制台输出 20120728,022,022。jsp页面显示是两条记录 022,022
然而正如上面所标注 第一个list.size()=2的 说明只有2条记录。为什么输输出3次?就算3次吧 那为什么jsp页面遍历却又显示后面两个022,022呢?
我将service做如下修改:
public List<RuLanCollectMessage> get_collect_message(String plantype) {
List<Object[]> list=storeDao.get_collect_message(plantype);
System.out.println(list.size());
List RLCMList=new ArrayList();
for(int i=0;i<list.size();i++){
RuLanCollectMessage ruLanCollectMessage=new RuLanCollectMessage();
Object[] obj=list.get(i);
InStoreInfo isi=(InStoreInfo) obj[0];
ruLanCollectMessage.setPlancode(isi.getPlancode());
ruLanCollectMessage.setGuocode(isi.getGuocode());
ruLanCollectMessage.setLasttime((Date)obj[2]);
Long l=(Long)obj[1];
ruLanCollectMessage.setInputAllDateTou(l.intValue());
RLCMList.add(ruLanCollectMessage);
for(int y=0;y<RLCMList.size();y++){
RuLanCollectMessage r=(RuLanCollectMessage)RLCMList.get(i);
System.out.println(r.getPlancode());
}
}
return RLCMList;
}
我把RuLanCollectMessage ruLanCollectMessage=new RuLanCollectMessage();放到for循环里面去
现在System.out.println(r.getPlancode());输出还是:
20120728,022,022 三个 但是页面却对了 显示的是20120728,022。
说明:list.size()=2是对的就是两条记录 一个plancode是20120728;另一个是022.
我的几个疑问:
1.为什么两种写法都是输出 :20120728,022,022 按照正常情况下 应该只是20120728,022 为什么多出一个022
2.既然2中写法都输出一样的结果 为什么页面显示却又不一样呢?
真心求解释,那里错了?我已经晕了.............
为了更全面 我贴出Action和jsp
Action:
public String show_collect_message(){
try{
String plantype="2";
List<RuLanCollectMessage> list = storeService.get_collect_message(plantype);
ServletActionContext.getRequest().setAttribute("list", list);
}catch (Exception e) {
e.printStackTrace();
}
return "show_collect_message";
}
jsp:
<c:forEach items="${requestScope.list}" var="obj">
<tr>
<td>${obj.plancode }</td>
</tr>
</c:forEach>
采用struts2+spring+hibernate框架
------解决方案--------------------
你那是嵌套了两个for循环
for(int i=0;i<list.size();i++){ ... for(int y=0;y<RLCMList.size();y++){ RuLanCollectMessage r=(RuLanCollectMessage)RLCMList.get(i); System.out.println(r.getPlancode()); } }
[解决办法]
你的代码逻辑严重错误所致,请看注释
第一次的service代码:
public List<RuLanCollectMessage> get_collect_message(String plantype) { List<Object[]> list = storeDao.get_collect_message(plantype); System.out.println(list.size());// 取得list.size()=2 List RLCMList = new ArrayList(); /** * new 一个对象 ruLanCollectMessage */ RuLanCollectMessage ruLanCollectMessage = new RuLanCollectMessage();// 自定义的一个类 for (int i = 0; i < list.size(); i++) { Object[] obj = list.get(i);// 得到索引为i的那条记录 InStoreInfo isi = (InStoreInfo) obj[0];// obj[0]是一个InStoreInfo对象 /** * 循环为对象ruLanCollectMessage设置属性值 * 但是并每次循环并没有重新new一个新的对象,而是使用原来的对象,所以每次设置属性值只是对ruLanCollectMessage原来值的修改 * 也就是说,第一次循环设置ruLanCollectMessage.setPlancode为20120728,而当第二次循环的时候又将ruLanCollectMessage.setPlancode改为022 * 因此到最后ruLanCollectMessage的值始终会是list循环的最后一个结果值,也就是你的 022 */ ruLanCollectMessage.setPlancode(isi.getPlancode()); System.out.println(isi.getPlancode());// 输出 20120728,022 ruLanCollectMessage.setGuocode(isi.getGuocode()); ruLanCollectMessage.setLasttime((Date) obj[2]); Long l = (Long) obj[1]; ruLanCollectMessage.setInputAllDateTou(l.intValue()); /** * 每次循环将ruLanCollectMessage加入新的集合中, * 第一次循环将20120728放入集合 ,第二次将20120728修改为022,然后又放入集合一次,所以会有两个022,页面上输出两个022 */ RLCMList.add(ruLanCollectMessage); for (int y = 0; y < RLCMList.size(); y++) { RuLanCollectMessage r = (RuLanCollectMessage) RLCMList.get(i); /** * 这个循环放在大循环里面,大循环第一循环的时候,RLCMList.size()=1,里面的值为20120728,所以此处输出20120728 * 大循环第二次循环的时候,RLCMList.size()=2,里面的值为两个022,所以输出022,022 */ System.out.println(r.getPlancode()); } } return RLCMList; }
[解决办法]
同一个对象 的引用 !
[解决办法]
public List<RuLanCollectMessage> get_collect_message(String plantype) { List<Object[]> list = storeDao.get_collect_message(plantype); System.out.println(list.size()); List RLCMList = new ArrayList(); for (int i = 0; i < list.size(); i++) { /** * 每次循环重新new一个RuLanCollectMessage对象,分配新的内存地址 */ RuLanCollectMessage ruLanCollectMessage = new RuLanCollectMessage(); Object[] obj = list.get(i); InStoreInfo isi = (InStoreInfo) obj[0]; /** * 对新的RuLanCollectMessage对象赋值,第一次赋值20120728,第二次赋值022 */ ruLanCollectMessage.setPlancode(isi.getPlancode()); ruLanCollectMessage.setGuocode(isi.getGuocode()); ruLanCollectMessage.setLasttime((Date) obj[2]); Long l = (Long) obj[1]; ruLanCollectMessage.setInputAllDateTou(l.intValue()); /** * 每次将新的RuLanCollectMessage对象放入新的list中,list中两个值20120728,022 */ RLCMList.add(ruLanCollectMessage); for (int y = 0; y < RLCMList.size(); y++) { RuLanCollectMessage r = (RuLanCollectMessage) RLCMList.get(i); /** * 这个循环放在大循环里面,大循环第一循环的时候,RLCMList.size()=1,里面的值为20120728,所以此处输出20120728 * 大循环第二次循环的时候,RLCMList.size()=2,里面的值为两个022和20120728,所以输出20120728,022 * * 总共输出三个值 */ System.out.println(r.getPlancode()); } } return RLCMList; }
[解决办法]
A a = new A();//
List list = new ArrayList();
for(int i = 0; i < 10; i++) {
//对a操作
//这里操作修改的是a引用所指向的对象,对象的内容是修改了,但是a的引用地址没变
list.add(a);//这里不管循环多少次,你加入到list里面的都是同一个对象
}
[解决办法]
你看你的两个for循环的综括号
假如外层循环 seze=2 然后到内层 此时内层是1 然后打印一次 然后再外层
此时内层size已经是2 然后再打印两次 总共三次
[解决办法]
第二个错误是这样的
假如写在外面 就是一个成员变量了
那么for 循环 换坏的一直是这个变量
假如写在里面是这样的
for(){
a
}
假如 for 循环的 长度是2 那么每一次循环都会把相同变量的对象覆盖
你应该去学基础了