0
String dirtyStr = "Who. do yo$u th,ink you    are?!";
         System.out.println(scrub(dirtyStr));
static String punct = ".,?!:;\"(){}{}<>"; 
      public static String scrub(String s)
      {         
         for(int x = 0; x < s.length(); x++)
         {
            for(int y = 0; y < punct.length(); y++)
                {
                    if(s.charAt(x) == punct.charAt(y))
                    {
                        s = s.replace("" + s.charAt(x), "");
                    }
                }       
         }
         return s;  
      }

スタックトレース

Exception in thread "main" java.lang.StringIndexOutOfBoundsException: String index out of range: 28
    at java.lang.String.charAt(String.java:658)
    at StringMethods_7_Gupta.scrub(StringMethods_7_Gupta.java:120)
    at StringMethods_7_Gupta.main(StringMethods_7_Gupta.java:95)
4

5 に答える 5

3

s.length()キャラクターを置き換えるたびに変更を追跡していません。連続する句読点をスキップしないように、ループ カウンターから 1 を減算して置換位置の新しい文字をチェックした後、文字を置換するときにループから抜け出します。

String dirtyStr = "Who. do yo$u th,ink you    are?!";
System.out.println(scrub(dirtyStr));

static String punct = ".,?!:;\"(){}{}<>"; 

  public static String scrub(String s)
  { 
     for(int x = 0; x < s.length(); x++)
     {
        for(int y = 0; y < punct.length(); y++)
            {
                if(s.charAt(x) == punct.charAt(y))
                {
                    s = s.replace("" + s.charAt(x), "");
                    x--;
                    break;
                }
            }       
     }
     return s;  
  }

実装の変更を検討している場合は、正規表現を使用して、すべての句読点をreplaceAll()メソッドの呼び出しだけに置き換えることができます。

System.out.println(dirtyStr.replaceAll("[.,?!:;\"(){}{}<>]",""));
于 2013-09-09T03:23:43.127 に答える
1

私は少し酔っていますが、ループの最初で文字列の長さを確認してから、文字列から文字を削除し始め、ループが文字列の末尾をオーバーランしているようです。while ループが必要だと思うので、すべての反復の前にインデックスが範囲内にあることを確認できます。

int x = 0;
while(x < s.length())
         {
            for(int y = 0; y < punct.length(); y++)
                {
                    if(s.charAt(x) == punct.charAt(y))
                    {
                        s = s.replace("" + s.charAt(x), "");
                    }
                }   
            x++;    
         }

私はタブレットを使っているので醜いですが、うまくいくと思います。

于 2013-09-09T03:20:11.797 に答える
1

sより短いものに置き換えていますsが、元の文字列の最後に移動しようとしています。また、句読点をスキップするため、連続する句読点も失われます。x一致するたびにループを再開する必要があります。

于 2013-09-09T03:20:19.220 に答える
0

s の長さを変数に保持し、s の文字を削除するたびに、s を 1 減らし、長さも 1 減らします。次のようになります。

int aLength = s.length();
for(int x = 0; x < aLength; x++)
{
    for(int y = 0; y < punct.length(); y++)
    {
            if(s.charAt(x) == punct.charAt(y))
            {
                    s = s.replace("" + s.charAt(x), "");
                    x--;
                    aLength--;
            }
     }       
}
return s; 
于 2013-09-09T03:33:28.207 に答える
0

必要なのは 1 行だけです。

public static String scrub(String s) {
    return s.replaceAll("[.,?!:;\"(){}\\[\\]<>]", "");
}

{}を含めるつもりだったと仮定して、重複する if も修正しました[]

于 2013-09-09T04:39:14.043 に答える