2012-04-23 10 views
3

からすべての空白を削除するための最も効率的な方法は、私は次のコードでそれを実装するのですが、私はStringBuilderののjava:何StringBuilderの

private static StringBuilder removeBlankSpace(StringBuilder sb){ 
    for(int i=0;i<sb.length();++i){ 
     if(Character.isWhitespace(sb.charAt(i))){ 
      sb.deleteCharAt(i); 
          i--; 
     } 
    } 
    return sb; 
} 
からすべての空白を削除するためのより効率的な方法があるのか​​どうかわかりません
+1

uはこれを見ましたか? http://stackoverflow.com/questions/3396525/remove-empty-character-from-string –

+0

関数に新しいStringBuilderを作成し、空白でない文字をすべてコピーする必要があります。メソッドdeleteCharAtは1つの文字を削除し、残りの文字配列を移動します。メソッドは入力パラメータを変更すべきではありません! –

答えて

10

あなたは何度もdelete多くを呼び出すべきではありません - 単にダウンし、最終的な各キャラクターを動かします最後に範囲を削除します。

static void removeBlankSpace(StringBuilder sb) { 
    int j = 0; 
    for(int i = 0; i < sb.length; i++) { 
    if (!Character.isWhitespace(sb.charAt(i))) { 
     sb.setCharAt(j++, sb.charAt(i)); 
    } 
    } 
    sb.delete(j, sb.length); 
} 
+0

非常に良い。私はそれが好きです。 –

+0

1つの可能性のある最適化: 'j'が0の間は、何も変更せずに空白をチェックするだけです。したがって、最初の空白が見つかるまで最初のループを1つ、次に残りのメソッドを表示することができます。 –

+1

私たちはパフォーマンスに着手していますが、おそらく 'sb.delete'の代わりに' sb.setLength'を最後に使用する方が効率的です。 –

3

編集:この回答を後世に残して、but Keith Randall's O(n) solutionははるかに良いです。

文字を削除するまでに遠端から作業する方が効率的です。後で空白をコピーしないでください。

また、データに複数の空白文字が混在する傾向がある場合は、それを見つけてdeleteCharAtではなくdeleteに電話してください。だから、のようなもの:(あなたのStringBuilder sbを初期化していると仮定して)後、約

private static StringBuilder removeBlankSpace(StringBuilder sb) { 
    int currentEnd = -1; 
    for(int i = sb.length() - 1; i >= 0; i--) { 
     if (Character.isWhitespace(sb.charAt(i))) { 
      if (currentEnd == -1) { 
       currentEnd = i + 1; 
      } 
     } else { 
      // Moved from whitespace to non-whitespace 
      if (currentEnd != -1) { 
       sb.delete(i + 1, currentEnd); 
       currentEnd = -1; 
      } 
     } 
    } 
    // All leading whitespace 
    if (currentEnd != -1) { 
     sb.delete(0, currentEnd); 
    } 
    return sb; 
} 
+0

ありがとうございますが、どうして私は遠端から作業する必要があるのか​​わかりません、詳細を説明できますか? – remy

+0

@remy:1つのスペースとそれ以外のスペース、そして100万スペースの文字列があるとします。最初に最初のスペースを削除すると、必要がないときにすべてのスペースがコピーされます。私が編集したように、キースの答えははるかにいいです:) –

+0

ありがとう、それを説明するためにありがとう。 – remy

2

方法:

sb = new StringBuilder(sb.toString().replaceAll("\\s", "")); 
+0

これは、最終スペースの前に*すべて*を削除します。だから "こんにちは"がそこになる。私はそれが必要なものだとは思わない。また、スペースのみを検出します。 –

+0

@Jon Skeet、ありがとう。私の編集を参照してください。 – aviad

+0

それは(リテラルでバックスラッシュをエスケープした後で)うまくいくでしょうが、それはちょっとStringBuilderで始まる点を打ち負かしています... –

1

コードは、文字列

int i = 0; 
int j = 0; 

for (; i < whiteSpcaTest.length();) { 
    i = 0; 
    if (Character.isWhitespace(whiteSpcaTest.charAt(i))) { 
    whiteSpcaTest.deleteCharAt(i); 

    } else { 
    break; 
    } 
} 
for (; j >= 0;) { 
    j = whiteSpcaTest.length() - 1; 
    if (Character.isWhitespace(whiteSpcaTest.charAt(j))) { 
    whiteSpcaTest.deleteCharAt(j); 

    } else { 
    break; 
    } 

} 
0

Javaの文字列はトリム()メソッドは、先頭と末尾のスペースを排除の大手&末尾のスペースを削除します。スペース文字のユニコード値は '\ u0020'です。 Java文字列のtrim()メソッドは、文字列の前後にこのunicode値をチェックします。存在する場合は空白を削除し、省略された文字列を返します。たとえば、次のように

public class StringTrimExample{ 
public static void main(String args[]){ 
String s1=" hello string "; 
System.out.println(s1+"javatpoint");//without trim() 
System.out.println(s1.trim()+"javatpoint");//with trim() 
}} 

と結果:

hello string javatpoint 
hello stringjavatpoint