2016-08-13 3 views
0

これは実際にはのCodingBatからの練習です。指定された部分文字列をJavaで削除する

文字列を指定すると、文字列 "del"がインデックス1から始まる場合、その "del"が削除された文字列を返します。それ以外の場合は、文字列をそのまま返します。

  • delDel( "adelbc")→ "ABC"
  • delDel( "adelHello") "aHello"
  • delDel( "adedbc")→ "adedbc"

→次のように私の仕事は次のとおりです。

public String delDel(String str) { 
    String del = "del"; 

    if (str.indexOf(del, 1) == 1){ 
    str.replaceFirst("del", null); 
    } 

    return str; 
} 

それはほとんどの場合のために正常に動作しますが、私はNullPoiを取得"adelbc"、 "adelHello"および "adel"というケースでは、nterExceptionがあります。私はなぜそれほど理解できないのですか?

+0

にのみ与えられた署名を持つ関数を提供する必要がありますし、それにテストを実行しますか? – mszymborski

+5

ヌルの代わりに '' '' - 空の文字列を使用するとどうなりますか?たぶん、JREは置き換えられた文字列で何かを実行します。ここでnullを使用するのはかなり奇妙です。 – mszymborski

+1

ローカルでテストしました。置換する文字列として 'null'を使うと' NullPointerException'がスローされます。 '' ''はあなたがしたいことは間違いありません。 – MattDs17

答えて

4

あなたはOpenJDKのソースによく見ると、あなたは手順を交換するため、この1を含む正規表現機能にreplaceFirstというの代表者が働くことに注意しましょう:交換はnullにすることはできませんことを

public String replaceFirst(String replacement) { 
    if (replacement == null) 
     throw new NullPointerException("replacement"); 
    reset(); 
    if (!find()) 
     return text.toString(); 
    StringBuffer sb = new StringBuffer(); 
    appendReplacement(sb, replacement); 
    appendTail(sb); 
    return sb.toString(); 
} 

注意。私はJREの他の実装でも動作が似ていると想定しています。代わりにnullの代わりに"" - 空文字列を使用してください。

また、cricket_007のコメントで述べたように、元の文字列は影響を受けないため(Javaのすべての文字列は不変です)、replaceFirstの結果を保存します。コードの最後のピース:私はCodi​​ngBatを想定

public String delDel(String str) { 
    String del = "del"; 

    if (str.indexOf(del, 1) == 1){ 
    return str.replaceFirst("del", ""); 
    } 

    return str; 
} 
+0

@ cricket_007:申し訳ありません。幸いにもあなたは編集のためのライセンスを持っています;) – mszymborski

関連する問題