席替えシステムを実装してみた。
先日受講生の席替えをすることになりました。
damePG何も考えずに
「席替えシステム作りますわ!!」
と安易にいうと受講生が
「お〜」と
安易にいうもんではなかったなと後悔しました。
でも一瞬で作る自信はありました。
実はみんなあまり知られていないけどCollectionsクラスの
shuffleメソッドというのがあって、
簡単にListをランダムに入れ替えてくれます。
今回の機能を洗いなおします
- テキストファイルに全員の名前を書く
- テキストを読み込んメンバー全員を表示
- シャッフルして表示する
では吟じます。
今回は受講生の名前は使えないので
WBC全日本代表を例にあげます。
まずこんなテキストファイルを用意します。
イチロー 片岡易之 小笠原道大 村田修一 岩村明憲 内川聖一 青木宣親 城島健司 川崎宗徳 松坂大輔 ダルビッシュ有 岩隈久志 田中将大 藤川球児 中島裕之 阿部慎之介
では表示までのプログラムです。
package sekigae; import java.io.BufferedReader; import java.io.FileInputStream; import java.io.FileReader; import java.io.IOException; import java.io.InputStreamReader; import java.util.ArrayList; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SekigaeServlet extends HttpServlet{ @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { try { BufferedReader br = new BufferedReader(new FileReader("C:・・・・/member.txt")); List<String> memberList = new ArrayList<String>(); while (br.ready()) { memberList.add(br.readLine()); } HttpSession session = req.getSession(); session.setAttribute("memberList", memberList); req.getRequestDispatcher("/index.jsp").forward(req, resp); } catch (Exception e) { req.getRequestDispatcher("/error.html").forward(req, resp); } } }
FileReaderの引数は絶対パスを指定します。
ここはテキストを読み込んでセッションに入れるだけです。
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <%@ page import="java.util.*" %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <% List list = (List)session.getAttribute("memberList");%> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>Insert title here</title> </head> <body> <div align="center"> <h1>以下のメンバーで席替えします</h1> <hr> <% for(Iterator it = list.iterator(); it.hasNext();) { String name =(String)it.next(); %> <%= name %><br> <% } %> <hr> <form action="sekigaeResult"> <input type="submit" value="席替えしようぜ!!"> </form> </div> </body> </html>
すると以下の画面になります。
一覧は表示できました。
次にシャッフルして表示します。
package sekigae; import java.io.IOException; import java.util.Collections; import java.util.List; import javax.servlet.ServletException; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; import javax.servlet.http.HttpSession; public class SekigaeResult extends HttpServlet { @Override protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException { HttpSession session = req.getSession(false); List list = (List)session.getAttribute("memberList"); Collections.shuffle(list); session.setAttribute("memberList", list); req.getRequestDispatcher("/result.jsp").forward(req, resp); } }
画面は以下です。
<%@ page language="java" contentType="text/html; charset=windows-31j" pageEncoding="windows-31j"%> <%@ page import="java.util.*" %> <% List list = (List)session.getAttribute("memberList"); %> <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd"> <html> <head> <meta http-equiv="Content-Type" content="text/html; charset=windows-31j"> <title>Insert title here</title> </head> <body> <div align="center"> <h1>席替え結果ページ</h1> <hr> <table border="1"> <tr> <% for(int i = 1; i <= list.size(); i++) { %> <td><%=list.get(i - 1) %></td> <% if(i % 4 == 0) { %> </tr><tr> <% } %> <% } %> </tr> </table> <form action="sekigaeResult"> <input type="submit" value="もう一回やる"> </form> <form action="sekigae"> <input type="submit" value="メンバーを確認する"> </form> </div> </body> </html>
お〜変わりましたねぇ。
ここで「メンバーを確認する」を押して
シャッフルされていたら意味がありません。
もう一回確認してみましょう
お〜変わってないです。
あると思います。