1

用語集の用語と定義を HTML で出力するプログラムに取り組んでいましたが、チェックしている定義にキーワードがあるかどうかに基づいて出力を変更したいと考えています。これを行うには、探しているすべてのキーワードを保持する ArrayList があり、foreach ループを使用しようとしましたが、実際には正しく機能していませんでした。これを行うより良い方法はありますか。誰かが私にこれについての指針を提供できますか。それほど難しいことではないと思います。HTMLビットを使用して、キーワードの前に先頭の単語を出力しようとしています(キーワードはHREFEDであると想定されています)。その後、定義内のキーワードチェックを過ぎて続行します。

ちなみに:checkValuesは私のArrayListで、valueTwoは定義です。

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

    for(String getTerm : checkValues){
                    String correct = getTerm + " ";

                if (valueTwo.contains(correct)) {


                int foundTermPosition = valueTwo.indexOf(correct);
                lead = valueTwo.substring(0, foundTermPosition-1);
                index = valueTwo.length() - lead.length();

                leftOver = valueTwo.substring(foundTermPosition+correct.length(), valueTwo.length());

                out.write(lead);

                out.write("<A HREF=\"#" + correct + "\">" + correct + "</A>");


                out.write(leftOver + "\n");

                }


              else
              {
                out.write(valueTwo);

              }

       }
4

2 に答える 2

1

編集:あなたの説明の後、あなたがしなければならないことはこれです:

String valueTwoWords [] = valueTwo.split(" "); // if value = "I went" 
                                               // valueTwoWords = ["I","went"]
for(String getTerm : checkValues)
 {
    for(int i = 0; i < valueTwoWords.length(); i++)
    {
       if(valueTwoWords[i].compareTo(getTerm) == 0) // If the words are the same.
       {
            int foundTermPosition = valueTwo.indexOf(getTerm); 
            lead = valueTwo.substring(0, foundTermPosition-1);
            index = valueTwo.length() - lead.length();

            leftOver = valueTwo.substring(foundTermPosition+getTerm.length(), valueTwo.length());

            out.write(lead);
            out.write("<A HREF=\"#" + getTerm + "\">" + getTerm + "</A>");
            out.write(leftOver + "\n");
            i = valueTwoWords.length() + 1; // getting out of the cycle.
       }
     }
   }

文字列に黒いスペースを追加しないでください。

String correct = getTerm + " ";

文字列を直接比較してみてください。

if (valueTwo.contains(getTerm))

次の文字列がある場合:

    String s1 = "hi";
    String s2 = "hi";
    String s3 = "hi ";

これs1.contains(s2));は戻りtrueますが、s1.contains(s3));戻りfalseます。

目的が 2 つの単語が同じかどうかを確認することである場合は、compareTocontains メソッドの代わりに method を使用する必要があります。

比較する

public int compareTo(Object o)

この文字列を別のオブジェクトと比較します。オブジェクトが文字列の場合、この関数は compareTo(String) のように動作します。それ以外の場合は、ClassCastException がスローされます (文字列は他の文字列とのみ比較可能であるため)。

ご了承ください:

戻り値:

引数がこの文字列と辞書的に等しい文字列である場合は値 0 。引数が この文字列よりも辞書的に大きい文字列である場合は0 未満の値。引数がこの文字列よりも辞書的に小さい文字列である場合は、 0 より大きい値。(ソース

したがって、 for string1andstring2 string1.compareTo(string2)は、等しい場合は 0 を返します。これがあなたがしたいことなら:

if (valueTwo.compareTo(getTerm) == 0)

最後に、オブジェクトが valueTwo が ArrayList にあるかどうかを一度チェックするだけの場合は、使用できます

if(checkValues.contains(valueTwo))
// do something
于 2012-12-04T01:10:06.513 に答える
1

コメントを投稿する担当者がいないため、dreamcrash の投稿にコメントすることはできませんが、彼のポイントは、「ハイ」、「ヒップ」などの単語が「こんにちは」という単語としてカウントされるのを避けることだと思います。スペースはこれを強制しますよね?これが最善の方法だと言っているわけではありません。なぜなら、句読点が問題になる可能性があるからです (たとえば、「こんにちは」)。私が間違っている場合は、私を修正してください。

また、質問に答えるために。indexOf は、渡された 2 番目の値として開始点を取ることもできると思います。ループを続行するための開始値として、最近見つかった発生場所 (foundTermPosition) を設定できます。そう...

    ArrayList<Integer> foundTermPositions;   
    int startingPoint = 0;     

    while(valueTwo.indexOf(correct , startingPoint) != -1) {
         foundTermPositions.add(valueTwo.indexOf(correct);
         startingPoint = valueTwo.indexOf(correct, startingPoint) + correct.length();  
    }

ArrayList の各項目に対して残りのコードを実行します。

于 2012-12-03T21:07:26.460 に答える