プロが教えるわが家の防犯対策術!

こういうプログラムがあります。

<%@ page language="java" contentType="text/html; charset=Shift_JIS"
import="java.io.*,java.util.*,java.text.*"%>
<!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=Shift_JIS">
<title>商品一覧</title>
</head>
<body>
<h1 style="font-size:14pt;background:#ccccff">商品一覧</h1>
<table border="0">
<tr style="background:#ccccdd">
<th>商品ID</th><th>商品名</th><th>現在価格</th><th>入札</th><th>残日数</th>
</tr>
<%
String tmpStr;
StringTokenizer tkn;
FileReader fr = new FileReader(application.getRealPath("data.txt"));
BufferedReader br = new BufferedReader(fr);
DecimalFormat df;
df = new DecimalFormat("###,###");
Calendar calToday = Calendar.getInstance();
Calendar calTmp = Calendar.getInstance();
//ストリームが読み込み可能かどうかを返します
while (br.ready()) {
tmpStr = br.readLine();
out.println("<tr style='background:#ffffcc'>");
tkn = new StringTokenizer(tmpStr, "\t");
byte i;
i=0;
String strTmp;
while (tkn.hasMoreTokens()) {
strTmp = tkn.nextToken();
if (i==1) {
out.println("<td>" + strTmp + "</td>");
}else if (i!=4) {
out.println("<td align='right'>" + df.format(Long.parseLong(strTmp)) + "</td>");
}else {//残日数の計算
calTmp.set(Calendar.YEAR, Integer.parseInt(strTmp.substring(0,4)));
calTmp.set(Calendar.MONTH, Integer.parseInt(strTmp.substring(5,7))-1);
calTmp.set(Calendar.DATE, Integer.parseInt(strTmp.substring(8,10)));
Date dteToday = calToday.getTime();
Date dteTmp = calTmp.getTime();
long diff = (dteTmp.getTime() - dteToday.getTime()) / (24*60*60*1000);
out.println("<td align='right'>" + Long.toString(diff) + "</td>");
}
i++;
}
out.println("</tr>");
}
br.close();
fr.close();
%>
</table>
</body>
</html>

このプログラムが読み込んでいるテキストファイルです。

100タンロップ1箱1500012009/03/15
200WELSON36個370022009/03/20
300フリジストンXT81個1250022009/03/21
400120球プレッシャーボール1600002009/03/23
500ヨネッグススポンジボール101002009/03/25 

問題のプログラムは最初の100、200、300、400、500という数字を入力すると、その商品の内容が縦書きで表示されるというモノです。
tmpStr = br.readLine();
で1行分取り出して、
tkn = new StringTokenizer(tmpStr, "\t");
でタブで区切って表示させるプログラムなのでどうにかなるようにも思えるのですが……。
1番難しいと思うのは検索番号を入力した際にその商品とどう結びつけるのか、ですね。
質問の意味が分かる方、アドバイス宜しくお願い致します。

A 回答 (2件)

> 200で読み込みを終了するのは


> 100のデータも読み込んでますよね
当然読みこむわよ。
でも破棄すればいいじゃない。
具体的に言うと変数の上書きね。

> 接頭語
100とか200とか入力した数字でしょ?

> 他に比較する方法
splitやStringTokenizerで配列にしてequalsするなり
indexOfするなり数値に変換して==するなり何でもできると思うけど。
人間ならどういう比較をするか
を考えるとわかりやすいわよ。
あとはそれを実現するAPIがあるかないか
それだけのこと。

> 縦書き
\tで分解した後
ループでまわして
printlnするだけよ。
ちなみに一つのテクニックとして
\tを\nに置換した方が楽だと思わない?
もっとも課題に沿っている回答かどうかは分からないけど。
    • good
    • 0
この回答へのお礼

姉御、再度のレスを頂き、心から感謝します。
実は、
<!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=Shift_JIS">
<title>商品検索</title>
</head>
<body>
<h1 style="background:#ccccff" >商品検索</h1>
<form method="POST" action="Sample7.jsp">
検索する商品ID:
<input type="text" name="kensaku" size="15"/>
<input type="submit" value="検索"/>
</form>
</body>
</html>

予想されていたかもしれませんが、上記のHTMLファイルから番号を入力して検索します。
そうすると
while(startWith==request.getParameter("kensaku")) {
こんな感じになるのでしょうか。
どうなんだろう……他にもいろいろな方法がありましたよね。
やっぱり姉御は凄いですね。自分は足元にも及びません。
この後、
StringTokenizer(tmpStr, "\t");
でデータを取り出してout.printlnか<br>で縦に並べればいいんですかね。
でも、上のプログラムのどこを削除してどこに加えればいいのか、がさっぱりです。
1番最初からあった悩みの中枢部ですね。

お礼日時:2009/03/07 13:13

たとえば200って入力されていたら


ファイルを1行ずつ読みこむ時に
200のデータが来た段階で読み込みを終了すればいいんじゃない?

比較する方法はたくさんあるけど
今回の場合はstartWithが楽だとお思うわよ。
    • good
    • 0
この回答へのお礼

姉御、お久しぶりです。
アドバイスありがとうございます。
200で読み込みを終了するのは
100のデータも読み込んでますよね。
そうすると、2つのデータが表示されませんかね。
startWithを使用した場合、接頭語がどの部分に当たるのですか。
他に比較する方法があれば、是非とも教えて頂きたいのですが。
どうも質問ばかりで、すいませんです。
後、縦書きではなくて、縦一列と言ったほうがいいみたいですね。

お礼日時:2009/03/07 09:28

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!