0

2 つの文字列間で一致するトークンの数を見つけるには、助けが必要です。ArrayList に格納されている文字列のリストがあります (以下に例を示します)。

Line 0 : WRB VBD NN VB IN CC RB VBP NNP  
Line 1 : WDT NNS VBD DT NN NNP NNP  
Line 2 : WRB MD PRP VB DT NN IN NNS POS JJ NNS  
Line 3 : WDT NN VBZ DT NN IN DT JJ NN IN DT NNP  
Line 4 : WP VBZ DT JJ NN IN  NN  

ここでは、各文字列がスペースで区切られた一連のトークンで構成されていることがわかります。だから、私が取り組む必要がある3つのことがあります..

  1. 行 0 の最初のトークン (WRB) と行 1 のトークンを比較して、それらが一致するかどうかを確認します。一致が見つかるまで、行 0 の次のトークンに進みます。一致した場合は、1 行目の一致したトークンをマークして、再度一致しないようにします。
  2. Line 0 と Line 1 の間で一致したトークンの数を返します。
  3. 一致したトークンの距離を返します。例: トークン NN は、行 0 の位置 3 と行 1 の位置 5 にあります。距離 = |3-5| = 2

分割文字列を使用して String[] に保存しようとしましたが、String[] は固定されており、新しい要素を縮小または追加することはできません。パターン マッチャーを試しましたが、悲惨な結果になりました。他のいくつかの方法を試してみましたが、ネストされた for ループにいくつかの問題があります..(役立つ場合は、コーディングの一部を投稿します)。

この問題を解決する方法についてのアドバイスや指針をいただければ幸いです。どうもありがとうございました。

4

2 に答える 2

0

さまざまな方法でタスクについて考えてください。トークンをスキャンして (したがって、スキャナー)、トークンを照合する必要があります (したがって、順序が必要なため、リスト)。次に、一致と距離に注意して、トークンごとに異なるコレクションを反復処理します。 .

于 2012-09-04T09:38:41.287 に答える
0

Scannerを使ってみましたか?

そうでない場合は、完全に行います。次のようになります。

String line1 = ... // your line 1
String line2 = ... // your line 2
Scanner s1 = new Scanner(line1); 

int i1 = 0;
while (s1.hasNext()) {
    String token1 = s1.next();
    Scanner s2 = new Scanner(line2);

    int i2 = 0;
    while (s2.hasNext()) {
        String token2 = s2.next();

        // now you have token1, token2 and their positions (i1, i2)
        // do whatever you want with them

        i2++;
    } // end reading line2
    i1++;
} // end reading line1

編集: Arraylist 内の異なる行を選択するためのループに関して、必要なのは、すべての配列要素を他のすべての配列要素と比較することです(この説明が不足している場合、これはおそらくグーグルするのが最善の方法です)。

Java では、次のようになります。

for (int i = 0; i < thearraylist.size()-1; i++) {
    for (int j = i+1; j < thearraylist.size(); j++) {

        // now the elements and indices i and j are compared
        // if we were running into my code above:

        String line1 = thearraylist.get(i);
        String line2 = thearraylist.get(j);

        // ... and then compare them

     }
}

2 番目のループが i+1 から始まる理由は、これらの不要な比較を排除するためです。

  1. すべての要素は、j=i の各ポイントでそれ自体と比較されますが、これは役に立ちません。上記のループでは、j は i+1 から始まり、増加するため、i と等しくなることはありません。
  2. 要素の各ペアは 2 回比較されます。たとえば、i=0、j=1 の場合、最初の 2 つの要素を比較しています。i=1、j=0 の場合、最初の 2 つの要素も比較しています。これにより、2 番目の比較が冗長になります。2 番目の「後方」比較を取り除くために、j は常に i よりも大きいと主張します。

これがわかりにくい場合は、ループを移動するときに i と j の値をリストして紙に書き出すことを強くお勧めします。

于 2012-09-04T10:20:31.197 に答える