0
         for(i=0;i<m1.length();i++)
             for(j=0;j<m2.length();j++)
                 if(m1.charAt(i)==m2.charAt(j)){
                     intersection=intersection+m1.charAt(i); 
                     m2.charAt(j)=' ';



                 }

                    System.out.println(intersection);



         } while(devam==false);

    }

}

それが私のコードです。メソッドや配列を使用することは許可されていません。私たちは単なる初心者です。私のコードでは、の時点でエラーが発生します m2.charAt(j)=' ';。私がその行を書いたのは、交差点を見つけたときに、その要素を再度チェックするべきではないからです。助けてもらえますか?

4

2 に答える 2

1

ブライアンが言ったように、Java の文字列は不変です。これは、 のようなメソッド呼び出しを介して代入できないことを意味しますm2.charAt(j)=' '。これは、別の方法を使用して、文字がまだ見つかったかどうかを追跡する必要があることを意味します。

あなたはそれを追加することができintersection、文字をチェックするときに をintersection使用してそれが含まれていないことを確認しintersection.indexOf(char c)ます。これが -1 を返す場合、文字列には含まれていません。

編集:

申し訳ありませんが、出力がマルチセットであることを考慮していませんでした。上記は、出力がセットの場合の問題を解決します。

replaceFirst(String searchFor, String replacement)m2 で使用して削除できます。次のようになります。

    for( int i =0; i < m1.length(); i+=2)
    {
       if(m2.indexOf(m1.charAt(i)) != -1)
       {
          intersection = intersection + m1.charAt(1) + " ";
          m2 = m2.replaceFirst(new String(m1.charAt(i)), "");
       }
    }

したがって、m1 = '1 1 2 3 5' で m2 = '1 4 2 1' の場合、

最初のパス: '1 4 2 1' で 1 を探します

2 番目のパス: '4 2 1' で 1 を探します

3 番目のパス: '4 2' で 2 を探します

4 番目のパス: '4' で 3 を探します

5 番目のパス: '4' で 5 を探します

「1 1 2」を返す

スペースを考慮して、変数を 2 ずつ増やしていることに注意してください。これは、2 つの文字列が「aaaaa a」の形式で、「a」が 1 文字のみであると仮定した場合のみです。数字または 1 桁以上の長さの文字がある場合は、空白をスキップして、文字単位で調べるのではなく、別の方法で文字列を解釈する必要があります。

これらの仮定を行うことができれば、このループを実行する前に、Stringtrimメソッドを使用して m1 の末尾と先頭の空白を削除するのが賢明です。m1 = m1.trim()

于 2013-01-30T17:58:16.373 に答える
1

文字列の内容を変更することはできません

m2.charAt(j)=' ';

代わりにこれを行う

m2 = m2.replace(m2.charAt(j), ' ');

replace() は、最初のパラメータに等しい文字列の最初の文字を置き換えることに注意してください。文字列はセットを表すため、文字が繰り返されることはないと思います。それらがあり、それらすべてを置き換えたい場合は、代わりに replaceAll() を使用してください。

于 2013-01-30T18:01:25.887 に答える