2016-04-11 6 views
-1

O(n)の別の文字列内の指定された文字列(文字列だけではありません)内のすべての文字を削除するようにコードを変更するにはどうすればよいですか?他のデータ構造を使用すると助けになる場合もあります。指定された文字列からすべての文字を削除する

public static String removeChar(String s, char ch){ 
    StringBuilder sb= new StringBuilder(); 
    char[] charArray= s.toCharArray(); 
    for (int i=0; i<charArray.length; i++){ 
     if (charArray[i]!=ch) { 
      sb.append(charArray[i]); 
     } 
    } 

    return sb.toString(); 
} 

これは高速ですか?

UPDATE:私はあなたがString.indexOf(int)ch間隔の各部分を追加するためのループを使用することができ、Stringの各文字を反復むしろ、その後removeAllCharsInSecondStringFromFirstString(String S1, String S2)

+3

あなたはそれを自分で実装する必要がありますか? 'newStr = origStr.replaceAll(" [abcde] * "、" ")'私にはかなり魅力的です... –

+0

私はそれを自分で実装して練習するのが好きです。私は 'replaceAll'を見た –

+1

Guavaの[' CharMatcher'](http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html)クラスはこの種のクラスにとって優れていますものの、同様に。 – dimo414

答えて

1

を試してみるだろうまったく数値を削除しませんdimoの助けを借りて私はこの解決策を書いた:

public static String removeAllChars(String src, String dst){ 
    HashSet<Character> chars = new HashSet<>(); 
    char[] dstCharArray=dst.toCharArray(); 
    for (int i=0; i<dstCharArray.length; i++){ 
     chars.add(dstCharArray[i]); 
    } 
    StringBuilder sb = new StringBuilder(); 
    char[] srcCharArray = src.toCharArray(); 
    for (int i=0; i<srcCharArray.length; i++){ 
     if (!chars.contains(srcCharArray[i])){ 
      sb.append(srcCharArray[i]); 
     } 
    } 
    return sb.toString(); 

} 
+1

いい仕事です!複雑なJavaクラスをスキップして配列を単純に使用する方が、はっきりとわかるかもしれません。詳細については、私の答えを参照することができます。 –

+1

'String'の文字をループするために' char [] 'を構築する必要はありません。 'String.charAt(i)'を使うと、別々の 'char []'を作る必要なしにインデックス 'i'に' char'を得ることができます。 – dimo414

+0

@ dimo414なぜHashMapをHashSetで使用するのですか? –

2

などの新機能を書きたいです。何かのように、

public static String removeChar(String s, char ch) { 
    StringBuilder sb = new StringBuilder(); 
    int p1 = 0, p2 = s.indexOf(ch); 
    while (p2 > -1) { 
     sb.append(s.substring(p1, p2)); 
     p1 = p2 + 1; 
     p2 = s.indexOf(ch, p1); 
    } 
    if (p1 < s.length()) { 
     sb.append(s.substring(p1, s.length())); 
    } 
    return sb.toString(); 
} 
+1

よく、関数を 'removeAllCharsInSecondStringFromFirstString()文字列S1、文字列S2) ' –

+2

[' String.indexOf(String、int) '](http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#indexOf-java .lang.String-int-)と 'p1 = p2 + s2.length();'次に、関連するすべての詳細をあなたの質問に含めます。 –

1

あなたは本当にあなたが取り除くしたい文字の集合を含むようにSetを使用することができ、この自分自身を実装する場合。ここでは、始めるためのテンプレートです:

public static String removeAllChars(String source, String charsString) { 
    HashSet<Character> chars = new HashSet<>(); 
    for (int i = 0; i < charsString.length(); i++) { 
    chars.add(charsString.charAt(i)); 
    } 

    StringBuilder sb = new StringBuilder(); 
    for (int i = 0; i < source.length(); i++) { 
    // chars.contains(source.charAt(i)) is O(1) 
    // use this to determine which chars to exclude 
    } 
    return sb.toString(); 
} 
+1

これは、ソース文字列の順序が変更されないことを保証しますか? –

+1

@MonaJalalループは 'source'文字列を順番にたどるので、' StringBuilder'に追加するものはすべて同じ順序になります。 – dimo414

0

はこれを使用してみてください。

String str = "343.dfsdgdffsggdfg333"; 
str = str.replaceAll("[^\\d.]", ""); 

出力は、将来的に削除が必要になります場合は、「343.333」

数値と特殊な値がヒントでこの

String str = "343.dfsdgdffsggdfg333"; 
string = string.replace(/[^a-zA-Z0-9]/g, ''); 
+0

投稿の下のコメントを読んでください! –

関連する問題