はじめに
Highlighting Code Block
導入してみたことだしなにかプログラミングについて書きたいな〜
カタカタカタ…ターン
ポチポチ……
あっ、これおもしろそう
ということでおもしろそうな内容をもとに
簡易的なアプリケーション作成をしてみました!!
挫折したり閃いたりしたので
役立てばいいなという箇所を紹介したいとおもいます!!
相性診断アプリ作成
作成内容
完成品ですが画像記載の流れで相性を判定します
アルファベットの数値変換
HTMLから入力データを送る
<form method="post" action="<%= request.getContextPath() %>/diagnosisMatch">
<table>
<tr>
<th>1人目の名前</th>
<td><input type="text" pattern="[a-zA-Z]+" placeholder="sato" name="first" required></td>
</tr>
<tr>
<th>2人目の名前</th>
<td><input type="text" pattern="[a-zA-Z]+" placeholder="suzuki" name="second" required></td>
</tr>
<tr>
<th></th>
<td><input type="submit" value="送信"></td>
</tr>
</table>
</form>
HTML(jsp)の名前入力欄はこんな感じにして、
自作のdiagnosiMatchServlet.javaにデータを送信します
送信データをServletで取得します
// 名前を取得
String name1 = request.getParameter("first");
String name2 = request.getParameter("second");
// 小文字に変換
name1 = name1.toLowerCase();
name2 = name2.toLowerCase();
HTMLでの送信時に正規表現で小文字だけにしても良かったのですが、
ユーザー目線でどっちでも対応してた方が良いかなぁ、
とおもい取得してから小文字にする流れにしました。
1文字ずつ分けて数値変換
// 数値変換用の文字列
String alphbet = "abcdefghijklmnopqrstuvwxyz";
// 1文字ごとに格納するための配列
ArrayList<Integer> nameScore1 = new ArrayList<>();
for(int i = 0; i < name1.length(); i++) {
// 1文字ずつ抜き取る
String str = name1.substring(i, i+1);
// その文字がアルファベットの何番目かを比較する
// aの場合0を返すので+1する
nameScore1.add(alphbet.indexOf(str) + 1);
}
for文の中でsubstringメソッドを使い、
1文字ずつ抜き出します。
substringメソッド
satoに対して
substring(0, 1)の場合
0と1の間にある文字(s)を抜き出します
(0 s 1 a 2 t 3 o 4 の並びのイメージ)
indexOfメソッドを使って抜き出した文字を
アルファベット表と比較して何番目にあるかを判定し、
数値に変換して+1(aは0番目、zは25番目というようにコンピュータ上は0スタートで
期待する結果と1ずれてしまうため)をして配列に格納します。
indexOfメソッド(一致する文字が何番目にあるかを返します)
String aiueo = “あいうえお”
aiueo.indexOf(“あ”)
結果: 0
aiueo.indexOf(“お”)
結果: 4
最初は
“a”と合致するなら1
“b”と合致するなら2
といったif文を26個書くことしか浮かばず、
スマートじゃない!!ってふて寝したので、
上記が閃いたときは脳汁が迸りました
数値の合算
数値を1行にまとめる
// name1 + name2 の順に格納する配列
ArrayList<Integer> case1 = new ArrayList<>();
for(int i = 0; i < nameScore1.size(); i++) {
case1.add(nameScore1.get(i));
}
for(int i = 0; i < nameScore2.size(); i++) {
case1.add(nameScore2.get(i));
}
既存の配列から1つずつ値を取得して1行にまとめます。
(イメージ:1 2(abさん) 3 4(cdさん)を1 2 3 4と1行にまとめます)
数値を合算する
// nameScore1 と 2の要素合計数
int elementTotal = nameScore1.size() + nameScore2.size();
for(int i = 0; i < elementTotal - 1; i++) {
// 合計値を格納する配列
ArrayList<Integer> tmpArray = new ArrayList<>();
for(int j = 0; j < case1.size() - 1; j++) {
int num = case1.get(j) + case1.get(j+1);
if(num >= 101) {
num -= 101;
}
tmpArray.add(num);
}
case1 = tmpArray;
}
1 2 3 4 であれば
①3 5 7
②8 12
③20
といったように要素数 – 1 回処理をする必要があります。
そのため最初に合計回数を変数として取得しています。
これが外側のループになります。
内側のループで隣り合った数値を足し、
101以上になる場合は101を引く処理を施します。
その後二重ループ内でのみ使えるtmpArrayに格納します。
(上記例だと3が格納された段階)
内側ループが完了したら(上記例だと3 5 7が格納されたら)
tmpArrayでcase1を上書きします。
これを外側ループ回数分繰り返します。
結果を表示
逆順(cdさんabさんの順)も上記と同じ流れで処理し、
数値が大きかった方を表示すれば完了です!!
チャルとの相性たっか!!
やったあああああああああ!!!!!!!
おわりに
取り乱しました、大変失礼いたしました。
この調子でほかにもアプリケーション作成して、
公開できたら良いなとおもっております!!
アルファベットの数値変換と
要素数が1ずつ減っていく場合の二重ループの組み立て方が
良い練習になるアプリケーション開発でした!!
文字の数値変換は「あいうえお」表なんかでも使うことができそうですね!!
それでは最後までお読みいただきありがとうございました
配布
<%@page contentType="text/html; charset=UTF-8" %>
<%
String result = (String)request.getAttribute("result");
if(result == null) {
result = "";
}
String name1 = (String)request.getAttribute("name1");
if(name1 == null) {
name1 = "";
}
String name2 = (String)request.getAttribute("name2");
if(name2 == null) {
name2 = "";
}
%>
<html>
<head>
<title>相性診断</title>
<link rel="stylesheet" type="text/css" href="<%= request.getContextPath() %>/css/main.css">
</head>
<body>
<div class = "container">
<% if(!result.equals("")) { %>
<h2><%= name1 %>と<%= name2 %>の相性結果</h2>
<h2><%= result %>点</h2>
<% } %>
<h2>相性診断</h2>
<p>相性診断したい名前をアルファベットで入れてください<br>
その二人の相性を診断します</p>
<h3>診断方法</h3>
<p>①アルファベットを数字に変換します<br>
(例:A or a → 1, Z or z → 26)</p>
<p>②隣り合った数字を足します<br>
(例:abcさん & defさん → 1 2 3 & 4 5 6 → 3 5 7 9 11)</p>
<p>③足した結果の要素数が1つになるまで繰り返します、<br>
また計算の過程で101以上になった場合は101を引きます<br>
(例: 60 70 → 130 → 29 相性29点)</p>
<p>④結果の大きい方を表示します<br>
(例: abさん & cdさんの場合、<br>
abcd or cdab の並びが考えられるため、結果が大きい方を表示します)
<form method = "post" action = "<%= request.getContextPath() %>/diagnosisMatch">
<table>
<tr>
<th>1人目の名前</th>
<td><input type="text" pattern="[a-zA-Z]+" placeholder="sato" name="first" required></td>
</tr>
<tr>
<th>2人目の名前</th>
<td><input type="text" pattern="[a-zA-Z]+" placeholder="suzuki" name="second" required></td>
</tr>
<tr>
<th></th>
<td><input type="submit" value="送信"></td>
</tr>
</table>
</form>
</div>
</body>
</html>
@charset "UTF-8";
.container{
margin-left: 30vw;
margin-top: 5vw
}
package servlet;
import java.io.IOException;
import java.util.ArrayList;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
public class DiagnosisMatchServlet extends HttpServlet {
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
request.setCharacterEncoding("UTF-8");
try {
// 名前を取得
String name1 = request.getParameter("first");
String name2 = request.getParameter("second");
// 遷移時に表示する
request.setAttribute("name1", name1);
request.setAttribute("name2", name2);
// 小文字に変換
name1 = name1.toLowerCase();
name2 = name2.toLowerCase();
//1文字ずつ切り取り数値に変換してArrayListに格納
String alphbet = "abcdefghijklmnopqrstuvwxyz";
ArrayList<Integer> nameScore1 = new ArrayList<>();
for(int i = 0; i < name1.length(); i++) {
// 1文字ずつ抜き取る
String str = name1.substring(i, i+1);
// その文字がアルファベットの何番目かを比較する
// aの場合0を返すので+1する
nameScore1.add(alphbet.indexOf(str) + 1);
}
ArrayList<Integer> nameScore2 = new ArrayList<>();
for(int i = 0; i < name2.length(); i++) {
String str = name2.substring(i, i+1);
nameScore2.add(alphbet.indexOf(str) + 1);
}
// nameScore1 と 2の要素合計数
int elementTotal = nameScore1.size() + nameScore2.size();
// name1 + name2 の順
ArrayList<Integer> case1 = new ArrayList<>();
for(int i = 0; i < nameScore1.size(); i++) {
case1.add(nameScore1.get(i));
}
for(int i = 0; i < nameScore2.size(); i++) {
case1.add(nameScore2.get(i));
}
for(int i = 0; i < elementTotal - 1; i++) {
// 合計値を格納する配列
ArrayList<Integer> tmpArray = new ArrayList<>();
for(int j = 0; j < case1.size() - 1; j++) {
int num = case1.get(j) + case1.get(j+1);
if(num >= 101) {
num -= 101;
}
tmpArray.add(num);
}
case1 = tmpArray;
}
// name2 + name1 の順
ArrayList<Integer> case2 = new ArrayList<>();
for(int i = 0; i < nameScore2.size(); i++) {
case2.add(nameScore2.get(i));
}
for(int i = 0; i < nameScore1.size(); i++) {
case2.add(nameScore1.get(i));
}
for(int i = 0; i < elementTotal - 1; i++) {
// 合計値を格納する配列
ArrayList<Integer> tmpArray = new ArrayList<>();
for(int j = 0; j < case2.size() - 1; j++) {
int num = case2.get(j) + case2.get(j+1);
if(num >= 101) {
num -= 101;
}
tmpArray.add(num);
}
case2 = tmpArray;
}
if(case1.get(0) > case2.get(0)) {
request.setAttribute("result", String.valueOf(case1.get(0)));
} else {
request.setAttribute("result", String.valueOf(case2.get(0)));
}
} catch(Exception e) {
e.printStackTrace();
} finally {
request.getRequestDispatcher("/view/diagnosisMatch.jsp").forward(request, response);
}
}
}