大家好,我是白菜拱的猪。
需求:
座位分为三种状态,1.有座。2,无座,3,损坏。
先根据自习室id在座位表中把所有座位存放在list中,即List< Seat >。然后根据座位的三种状态,显示为红色,白色,以及不显示。
Seat表中属性 seatId,row(所在行),col(所在列),status(状态)
controller:
@RequestMapping("query")
public ModelAndView querySeat(int roomId){
ModelAndView mv=new ModelAndView();
mv.setViewName("/manager/seat_update.jsp");
List<Seat> seatList=seatService.querySeat(roomId);
//获得房间的行数以及列数
Room room=roomService.queryRoomById(roomId);
mv.addObject("room", room);
mv.addObject("seatList",seatList);
return mv;
}
前台解决方案
<!-- 控制行 -->
<c:forEach var="i" begin="1" end="${requestScope.room.rows}"
step="1">
<div class="row seat-row" data-row="${i}">
<div class="col-xs-1 text-center">
<span class="row-num">${i}</span>
</div>
<div class="col-xs-11">
<!-- 控制列 -->
<c:forEach var="j" begin="1" end="${requestScope.room.cols}"
step="1">
<c:forEach items="${requestScope.seatList}" var="seat">
<c:if test="${(seat.row==i) && (seat.col==j)&& (seat.status=='有座')}">
<span class="seat-empty" data-col="${j}"></span>
</c:if>
<c:if test="${(seat.row==i) && (seat.col==j)&& (seat.status=='无座')}">
<span class="seat-sold" data-col="${j}"></span>
</c:if>
<c:if test="${(seat.row==i) && (seat.col==j)&& (seat.status=='损坏')}">
<span class="none" data-col="${j}"></span>
</c:if>
</c:forEach>
</c:forEach>
</div>
</div>
</c:forEach>
效果:
这是最初的想法,但是最后发现效率太差,因为每一次循环都要遍历list,效率着实的太差。
所有有了另一种想法,就是将List中的座位存入到一个二维数组,二维数组的下标就是座位的行与列,然后根据下标获得座位,然后通过座位的状态来确定座位的颜色,这样就避免了每一次都要遍历list。提高了效率。闲话少说,先写一个util。
写完之后,woc发现太牛了。一行代码就把问题解决了
public class SeatUtil {
public Seat[][] listToArray(List<Seat> list,int rows,int cols){
Seat[][] seatArray=new Seat[rows][cols];
for(Seat seat:list){
//这行代码妙啊
seatArray[seat.getRow()-1][seat.getCol()-1]=seat;
}
return seatArray;
}
}
然后controller层把这个二维数组传过去
@RequestMapping("query")
public ModelAndView querySeat(int roomId){
ModelAndView mv=new ModelAndView();
mv.setViewName("/manager/seat_update.jsp");
List<Seat> seatList=seatService.querySeat(roomId);
//获得房间的行数以及列数
Room room=roomService.queryRoomById(roomId);
//这行代码仔细品
Seat[][] seatArray=new SeatUtil().listToArray(seatList, room.getRows(), room.getCols());
mv.addObject("room", room);
mv.addObject("seatArray",seatArray);
return mv;
}
前台: 主要区别就是前台
<!-- 控制列 -->
<c:forEach var="j" begin="1" end="${requestScope.room.cols}"
step="1">
<c:if test="${requestScope.seatArray[i-1][j-1].status=='有座'}">
<span class="seat-empty" data-col="${j}"></span>
</c:if>
<c:if test="${requestScope.seatArray[i-1][j-1].status=='无座'}">
<span class="seat-sold" data-col="${j}"></span>
</c:if>
<c:if test="${requestScope.seatArray[i-1][j-1].status=='损坏'}">
<span class="none" data-col="${j}"></span>
</c:if>
</c:forEach>
successful!!!
品一品这两种方法的区别。效率区别在于第一种每次查询遍历太低。