席替えシステムを実装してみた。

先日受講生の席替えをすることになりました。
damePG何も考えずに
「席替えシステム作りますわ!!」
と安易にいうと受講生が
「お〜」
安易にいうもんではなかったなと後悔しました。
でも一瞬で作る自信はありました。

実はみんなあまり知られていないけどCollectionsクラスの
shuffleメソッドというのがあって、
簡単にListをランダムに入れ替えてくれます。

今回の機能を洗いなおします

  1. テキストファイルに全員の名前を書く
  2. テキストを読み込んメンバー全員を表示
  3. シャッフルして表示する

では吟じます。
今回は受講生の名前は使えないので
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>

すると以下の画面になります。
20090530225818
一覧は表示できました。
次にシャッフルして表示します。

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>

するとこんな画面になります。
20090530225820

「もう一回やる」を押してみます。
20090530225821

お〜変わりましたねぇ。

ここで「メンバーを確認する」を押して
シャッフルされていたら意味がありません。
もう一回確認してみましょう
20090530225818

お〜変わってないです。

あると思います。