Javaに関する様々な情報をご紹介します。

Javaに関する様々な情報をご紹介します。
評価

0

tableを使って表を作ったのですが、、

javaPRGとJSPを使って表を作成したのですが、思っているのとは違う形で表示されてしまうのでお知恵をお借りしたいです。

まずjavaでHashtableにKeyとValueを設定するクラスがあります。
public class GoodsList {
public static Hashtable goods = new Hashtable();
public GoodsList() {
        goods.put("0001", "きゅうり");
        goods.put("0002", "だいこん");
        goods.put("0003", "ねぎ");
        goods.put("0004", "ごぼう");
        goods.put("0005", "きゃべつ");
        goods.put("0006", "にんじん");
        goods.put("0007", "なす");
        goods.put("0008", "はくさい");
    }
}

そのHashtableのKeyとValueを取るためのメソッドを別のクラスで作りました。

public class Shop {

    GoodsList goodsList = new GoodsList();
    Enumeration goodsKey = goodsList.goods.keys();
    
    public String nextGoodCode() {
        String goodCode = "";
        goodCode = (String) goodsKey.nextElement();
        return goodCode;
    }
    
    public boolean hasMoreGoods() {
        return goodsKey.hasMoreElements();
    }
    
    public String getGoodName(String goodCode) {
        String goodName = (String) goodsList.goods.get(goodCode);
        return goodName;
    }
}
    
このクラスのメソッドをJSPで使いました。

<%@ page language="java" contentType="text/html; charset=Shift_JIS" %>
<%@ page import="shop.*" %>

    <%
        String goodCode = "";
        String goodName = "";
        
        Shop shop = new Shop();
    %>
    
<html>
    <head>
        <title>Shop</title>
    </head>

    <body>
        <form>
            <center>
                <h2>商品一覧</h2>
                <table border = "2" width = "80%">
                    <thead>
                        <tr><th>商品名</th> <th>商品名</th></tr>
                    </thead>
                    
                    <tbody align = "center">
                    <%
                        for (int i = 0; shop.hasMoreGoods(); i++) {
                            goodCode = shop.nextGoodCode();
                            goodName = shop.getGoodName(goodCode);
                            if (i % 2 == 0) {
                    %>
                                <tr><td><%= goodName %></td>
                        <%
                            } else {
                        %>
                                <td><%= goodName %></td>
                    <%
                            }
                        }
                    %>
                    </tbody>
                </table>
            </center>
        </form>
    </body>
</html>

で、表示はされるのですが、nextElementを使ってHashtableから取り出している為、Keyの数が大きい方から取られてしまい、JSPの表にした時、Keyの大きい方から表示されてしまいます。
これを、Keyの小さい方から順に表にしていきたいのです。昇順というのでしょうか。
その際、javaPRGの方はそのままにJSPの方のみを改造するならどのような手法・方法が考えられるでしょうか?

29

回答

6885

閲覧

29件の回答

評価

0

ハッシュから拾ったものを直接表示しないで、
いったんListに格納し、ソートしてから表示しましょう。

評価

0

<tbody align = "center">
                    <%
                        for (int i = 0; shop.hasMoreGoods(); i++) {
                            goodCode = shop.nextGoodCode();
                            goodCodeList.add(goodCode);
                            Arrays.sort(goodCodeList.getItems());
                        }
                        for (int i = 0; i < goodCodeList.getItemCount(); i++) { 
                            goodName = shop.getGoodName(goodCodeList.getItem(i));
                            if (i % 2 == 0) {
                    %>
                                <tr><td><%= goodName %></td>
                                
                        <%
                            } else {
                        %>
                                <td><%= goodName %></td></tr>
                    <%
                            }
                        }
                    %>
                    </tbody>

こういう事でしょうか?
これだと昇順なので、降順にするにはmioさんの言われている"ソート"とはやはり違っていますか?

評価

0

通常の方法で自分の思うようなソートにならない場合は、比較関数を自分で作ってあげる必要があります。
sort()メソッドには、比較関数を指定するバリエーションがあります。
調べてみてください。

評価

0

それから、ちょっとソートする位置もおかしいようです。
(動作としては問題ないですが、非効率です)

評価

0

降順にさせるための関数などが沢山あるのは見つけました。ですが難しいですね。どれもよく分からないものばかりだったので時間がかかりそうです。

ソートする位置がおかしいという事ですが、どこでソートすると効率が良くなりますか?改善点は直したいです。

評価

0

現状、ループでアイテムを1件追加するごとに、ソートしています。
アイテムを全部追加し終わった後にソートしても良いはずです。

あともうひとつ、最後の描画ループ。アイテムが奇数個の場合が考慮されていないようです。
(最近のブラウザは頭がいいので、おそらく問題なく表示できますが…)
アイテムは偶数個と決まっているのでしょうか?

評価

0

現状、ループでアイテムを1件追加するごとに、ソートしています。
アイテムを全部追加し終わった後にソートしても良いはずです。

あともうひとつ、最後の描画ループ。アイテムが奇数個の場合が考慮されていないようです。
(最近のブラウザは頭がいいので、おそらく問題なく表示できますが…)
アイテムは偶数個と決まっているのでしょうか?

評価

0

とすると、こうでしょうか?

<%
                        for (int i = 0; shop.hasMoreGoods(); i++) {
                            goodCode = shop.nextGoodCode();
                            goodCodeList.add(goodCode);
                        }
                        Arrays.sort(goodCodeList.getItems());
                        for (int i = 0; i < goodCodeList.getItemCount(); i++) { 
                            goodName = shop.getGoodName(goodCodeList.getItem(i));
                            if (i % 2 == 0) {
                    %>
                                <tr><td><%= goodName %></td>
                                <td><input type = "submit" name = "buy"  value = "購入"></td>
                        <%
                            } else if (i % 2 != 0) {
                        %>
                                <td><%= goodName %></td>
                                <td><input type = "submit" name = "buy"  value = "購入"></td></tr>
                    <%
                            } else {
                            }
                        }
                    %>

評価

0

ソートに関してはそうですが、最後のelseは何ですか?

評価

0

付けた方が良いのかと。。使われる事は無いでしょうが。
書籍なんかだとif〜elseは決まり事のようなものと書かれているので。やはり使わないものは必要ないですかね?

評価

0

明らかに2つのパターンしか存在しない場合、必要ありません。
それでも上の形にしろと書かれているような書籍がもしあるのなら、そんな本は信用しないほうがいいです。

ところで、アイテムが奇数個の場合の話は?

評価

0

ではmioさんの言う事を信用します。

アイテムは偶数個とは限らないです。Hashtableに追加される事も十分考えられます。
私としては、アイテムが奇数個だった場合は表の中に空きを作りたいです。現状だとアイテムの表示がある部分のみ表の枠があり、アイテムが無い部分は枠が無く真っ白です。そこにも枠だけは表示されるようにしたいです。

評価

0

もしくは表を削りたいです。
_____
|__|__|
|__|__|
|__|

こんな感じに。

評価

0

下のような表は、HTMLだけでは作れない(スタイルシートの知識が必要)ので、空のセルを作るのが楽でしょう。
奇数の場合、どういうHTMLが作られることになるかを考えてみてください。
つまり、ループした後に「奇数だったら足りないタグを書き足す」ようにしておけば良いでしょう。

一応ですが…100%信用するというのも、やめときましょう。
私もまだまだ勉強中なので知らないことはあるし、間違った知識もあります。勘違いして変な回答つけることもあります。
ifの記述に関しては問題ないとしても、書いていることが全部正解なんて保証は、当然ないので。

評価

0

分かりました〜。でもmioさんに助けられているのは確かです!

スタイルシートですかぁ。私にはまだ早そうです。

<%
                        for (int i = 0; shop.hasMoreGoods(); i++) {
                            goodCode = shop.nextGoodCode();
                            goodCodeList.add(goodCode);
                        }
                        Arrays.sort(goodCodeList.getItems());
                        for (int i = 0; i < goodCodeList.getItemCount(); i++) { 
                            goodName = shop.getGoodName(goodCodeList.getItem(i));
                            if (i % 2 == 0) {
                    %>
                                <tr><td><%= goodName %></td>
                                <td><input type = "button" name = "buy"  value = "購入"></td>
                    <%
                            } else if (i % 2 != 0) {
                    %>
                                <td><%= goodName %></td>
                                <td><input type = "button" name = "buy"  value = "購入"></td></tr>
                    <%
                            }
                        }
                        if (goodCodeList.getItemCount() % 2 != 0) {
                    %>
                            <td></td>
                            <td></td>
                    <%
                        }
                    %>

だと表示は変わりません。
タグは何のタグをどう書き足せば良いのでしょう。

評価

0

惜しいですね。もうちょっと足りません。

ええと、まずHTMLは理解されてるでしょうか?
HTMLのテーブルタグがどんなものかを知らなければ、「足りないもの」は分からないと思うので。

評価

0

…と思いましたが、テーブルタグを完全にするだけでは

>アイテムが無い部分は枠が無く真っ白です。

は変わりませんでした。
これは要素がないセルを表示する場合のテクニックなんですが、見えない文字(例えば改行だけ)を入れると、枠だけになります。

評価

0

では、テーブルタグを完全にした上で要素のないセルを表示するテクニックを使えば良いということですか。

HTMLも初めて間もないのでまだ理解しきれてはいません。

評価

0

<table border = "2" rules = "all" width = "80%">
にして
if文の中を
<td><br></td>
<td><br></td>
にしたら無事思い通りの結果になりましたー!
mioさんありがとうございます!丁寧なご指導で分かりやすかったです!

評価

0

ちょっと違います…。

> rules = "all"

これは要りません。IE専用ですし、なくても同じはずです。

言いたかったのは、

<td><br></td>
<td><br></td></tr>

ということです。<tr>を閉じてあげてください。
ループの中で、値入りで出しているほうにはついているはずです。

評価

0

rules="all"無くても出来ました(汗

では「テーブルタグで足りないもの」とは一体何だったんですか?

評価

0

レスの前半だけでなく後半も読んでもらえるとありがたいです。
最近のブラウザは、頭がいいのでなくても問題ないんですが、一部のブラウザでは、ないと表示がおかしくなります。

評価

0

レス見直しました。テーブルタグについても調べました。自分のソースも見ました。
ですがmioさんの仰っている事が分かりません。
自分ではサイトを参考にしてその通りに書いているつもりなのですが。。
「表示がおかしくなる」というのは表がおかしく表示されるという事でしょうか、それとも表の中身がでしょうか?

評価

0

ちょっと言い方が曖昧だったようです。
「テーブルタグ」というのは、<table>という意味ではなく、「テーブルに使うタグ」という意味です。
<thead><tbody><tfoot><tr><th><td>も含みます。

>「表示がおかしくなる」というのは表がおかしく表示されるという事でしょうか、それとも表の中身がでしょうか?
表がおかしくなるということです。

評価

0

<thead><tbody>だけで<tfoot>が無いからでしょうか。
<thead><tfoot>にしたらどうですか?表示はされました。

評価

0

あの…。あいさんの2006-06-22 13:16:21の

<td><br></td>
<td><br></td>

と、私の2006-06-22 13:33:07の

<td><br></td>
<td><br></td></tr>

の違いが、本当に分からないんでしょうか…?

評価

0

あ、それですか(汗
すみません、自分のソースの方は直していたので自分の中では解決済みになってました(汗
</tr>が無いと改行されず、一行が終わらないで続いてしまう、とかでしょうか?

評価

0

了解です。それなら問題なしです。

> </tr>が無いと改行されず、一行が終わらないで続いてしまう、とかでしょうか?
そうです。今のIEとかでは問題なく表示されるんですが、ちゃんと書いてあげないと理解できないブラウザも、いるので。
一応、HTMLはXMLの仲間ということになっていまして、XMLではこういう「閉じタグの省略」というのは認められていません。

これから先、厳密に書かないと受け付けてもらえなくなる…ということはないと思いますが、
これに限らず、できるだけきちんと書くように心がけておいたほうが、思わぬ問題に悩まされずに済むと思います。

評価

0

なるほど〜。勉強になります。

質問から6ヶ月以上経過しているので、回答を書き込むことはできません。