0

したがって、次のような ArrayList呼び出しがあります。originalList

[鍋、昼寝、鍋、座る、イッツ、ティス、スナップ]

次のような ArrayList呼び出しもありますmodifiedList

[anps、anps、opst、ist、ist、ist、anps]

変更されたリストは元のリストを取得し、句読点を削除して並べ替えます。このプログラムの目的は、入力 ( originalList) を受け取り、入力にアナグラムがあるかどうかを確認することです。アナグラムは、同じ文字で構成される単語です。アナグラムを出力するループで問題が発生しています。ループは次のとおりです。

    for (int i=0; i<modifiedList.size();i++){
        System.out.print(originalList.get(i));
        for (int j=i+1;j<modifiedList.size();j++){
            if (modifiedList.get(i).contentEquals(modifiedList.get(j))){
                System.out.print(" "+ originalList.get(j));
                originalList.remove(j);
                modifiedList.remove(j);                     
            }

        }System.out.println();

    }

ループを実行すると、次のようになります。

pans naps snap
pots
sit it's
tis

tis が sit のアナグラムとしてリストされていないことを除いて、すべて正しいです。これは、2 番目のループが tis に到達する前に終了する using の原因でありmodifiedList.remove(j)、tis は sit and it's で出力されることはありません。出力で単語が繰り返されないように modifiedList.remove(j) が必要です。tisがsitのアナグラムとしてリストされ、それがそうであるように、これをどのように修正しますか?

4

2 に答える 2

1

問題は、配列のインデックスを変更しているが、j を変更していないことです。削除すると、後続のすべてのアイテムのインデックスが 1 減少します。したがって、ヒットすると一致します。それを削除し、これを以前のインデックスに移動します。次に、j に 1 を追加します。これは、配列の最後から実行されます (スナップが既に削除されているため)。したがって、j を削除した後、j を 1 減らす必要があります。

于 2013-03-10T02:18:47.543 に答える
0

ループを逆にします。アレイの後ろから前に向かって作業します。そうすれば、エントリを削除しても、まだ読んでいないエントリのインデックスは変更されません。

他のオプションは、ループ インデックスを調整して削除を考慮することですが、それはよりトリッキーです。

(さらに別のオプションは、元の文字列と並べ替えられた文字列を含むオブジェクトを作成することです。これらの配列を作成し、並べ替えられた文字列で並べ替える並べ替えスキームを使用して並べ替えます。次に、リストをスキャンしていつソートされた同一のキーの「実行」があります。削除は必要ありません。

そのオブジェクトを作成する「詐欺師」の方法は、ソートされた文字列と元の文字列を 1 つの文字列にまとめ、スペースまたはその他の特殊文字で区切ってから、文字列をソートすることです。)

于 2013-03-10T02:19:18.527 に答える