【百占百胜】-三创比赛解决座位展示问题优化,根据list中对象的属性转化为二维数组

大家好,我是白菜拱的猪。
需求:
座位分为三种状态,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!!!
品一品这两种方法的区别。效率区别在于第一种每次查询遍历太低。

发布了24 篇原创文章 · 获赞 4 · 访问量 2038

猜你喜欢

转载自blog.csdn.net/weixin_44226263/article/details/105301828