0

私は現在、Java で書かれた独自のバージョンの用語集に取り組んでいます。正直なところ、これは学術的な性質のものであり、誰かが私を最初の方向に向けてくれることを望んでいました. とにかく、私はテキストファイルからテキストを読み込んで、単語とそれに対応する定義をマップ(より具体的にはツリーマップ)に入れています。そこからすべてがうまくいきます。すべてが本来あるべき姿でマップに表示されます。

ここで、HTML に移動してマップのコンテンツを出力する部分に到達し始めます。私はイテレータでそれを行う方法を知っていますが、それはそれほど問題ではありませんでした。しかし、HTML が混在するコンテンツを表示しようとすると、必要なすべてが得られません。ページは最終的に次のようになります: http://cse.osu.edu/~weide/rsrg/sce/now/321/421/labs/lab10/glossary.html#book

そして、定義内に用語が含まれている場合にクリック可能にするという、特に注意が必要な部分があります。これが私がこれまでに持っているものです。繰り返しますが、HTML の主要部分が表示されない理由を誰かが理解するのを手伝ってくれたら、とても感謝しています! ちなみに、取得元のテキスト ファイルは terms.txt と呼ばれ、書き込み先の html ファイルは用語集.html と呼ばれます。

これは私がこれまでに持っているものです:

public class Glossary {

/**
 * @param args
 * @throws IOException
 */
public static void main(String[] args) throws IOException {
    Map<String, String> dictionary = new TreeMap<String, String>();

    File htmlFile = new File(
            "/Users/myname/Documents/workspace/Lab10/src/glossary.html");
    File file = new File(
            "/Users/myname/Documents/workspace/Lab10/src/terms.txt");
    Writer out = new OutputStreamWriter(new FileOutputStream(htmlFile));

    String term = null;
    String def = null;
    String key = null, value = null;
    String lead = null;
    String multiFinalDef = null;
     Set<String> checkValues = new HashSet<String>();
    String leftOver = null;
    boolean check = false;
    Scanner input = null;
    try {
        input = new Scanner(file);

        while (input.hasNext()) {
            String keepTrack;
            boolean multi = false;
            String line = input.nextLine();

            term = line;
            def = input.nextLine();
            keepTrack = def;

            while (def.length() > 0 && input.hasNext()) {
                def = input.nextLine();

                if (def.length() > 0) {
                    multiFinalDef = " " + keepTrack + def;
                    multi = true;
                }

            }

            if (multi) {
                dictionary.put(term, multiFinalDef);

            } else {
                dictionary.put(term, keepTrack);

            }
            checkValues.add(term);

        }

    } catch (FileNotFoundException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    try {
        out.write("<HTML>\n");
        out.write("<HEAD>\n");
        out.write("</HEAD>\n");
        out.write("<BODY>\n");
        out.write("<H1>Glossary</H1>\n");
        out.write("<HR /\n");
        out.write("<H2>Index</H2>\n");
        out.write("<UL>\n");

    } catch (FileNotFoundException e1) {
        // TODO Auto-generated catch block
        e1.printStackTrace();
    } catch (IOException e) {
        // TODO Auto-generated catch block
        e.printStackTrace();
    }

    Set s = dictionary.entrySet();
    Iterator iterator = s.iterator();

    while (iterator.hasNext()) {


        Map.Entry m = (Map.Entry) iterator.next();

        // getKey is used to get key of map.
        key = (String) m.getKey();

        // getValue is used to get the value of the key in map.
        value = (String) m.getValue();

        // this is just so I know the output from the map is actually correct. And indeed it is.
        System.out.println("Key:\t\t\tValue\n " + key + "\t\t\t " + value
                + "\n");
        try {
            out.write("<LI><A HREF=\"#" + key + "\">" + key + "</A></LI>\n");
            out.write("</UL>\n");
            out.write("<HR />\n");

        } catch (IOException e) {
            e.printStackTrace();
        }

    }

    out.write("<H2>Terms and Definitions</H2>\n");
    out.write("<UL>\n" + "<P>\n");

    iterator = s.iterator();
    while (iterator.hasNext()) {
        Map.Entry temp = (Map.Entry) iterator.next();

        // getKey is used to get key of map.
        String keyTwo = (String) temp.getKey();

        // getValue is used to get the value of the key in map.
        String valueTwo = (String) temp.getValue();

        out.write("<H3><A NAME=\" " + keyTwo + "/><B><I><FONT COLOR=\"red\">"
                + keyTwo + "</FONT></I></B></LI></H3>\n");

    for(String getTerm : checkValues){

        if (valueTwo.contains(getTerm)) {

            check = true;
            int foundTermPosition = valueTwo.indexOf(getTerm);
            lead = valueTwo.substring(0, foundTermPosition - 1);
            //fix left over..
            leftOver = valueTwo.substring(foundTermPosition, valueTwo.length());
            out.write(lead);
            out.write("<A HREF=\"#" + keyTwo + "\">" + keyTwo + "</A>");
            out.write(leftOver + "\n");
            //out.write("</blockquote>\n");

        }
    }
            if( check == false)
            {
            out.write(lead + " " + valueTwo);
            }
        }



        //System.out.println(valueTwo + leftOver);

        // used to put words defined in file mentioned in definition
        // with hyperlinks to their associated locations, and output the
        // definition.

    out.write("</P>\n" + "</UL>\n");
    out.write("</BODY>\n");
    out.write("</HTML>");

    out.close();
}

}
4

2 に答える 2

1

プログラムが到達するまでに

out.write("<H2>Terms and Definitions</H2>\n");
out.write("<UL>\n" + "<P>\n");

while (iterator.hasNext()) {
   ...

インデックスを印刷している間、イテレータは数行前の最初のwhileループで使い果たされるため、これ以上アイテムが残っていません。マップを再度反復処理するには、イテレータメソッドを再度呼び出す必要があります。したがって、上のブロックは次のようになります。

out.write("<H2>Terms and Definitions</H2>\n");
out.write("<UL>\n" + "<P>\n");

iterator = s.iterator();
while (iterator.hasNext()) {
   ...
于 2012-12-03T09:55:11.393 に答える
0

私が理解しているように、あなたは html ドキュメントを生成したいと考えています。私の謙虚な意見では、あなたの場合の最善かつ一般的なアプローチは、いずれかのテンプレート エンジンを使用することです。例 - Apache Velocity

このチュートリアルを完了するには数分かかります

于 2012-12-03T10:34:31.087 に答える