(Java)アルファベット数字変換

IT
広告

はじめに

チャル
チャル

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);
		}
	}
}
タイトルとURLをコピーしました