2016-04-11 3 views
-1

Wie kann ich meinen Code so ändern, dass er alle Zeichen in einer bestimmten Zeichenfolge (nicht nur einer Zeichenfolge) in einer anderen Zeichenfolge in O(n) entfernt? Wenn Sie andere Datenstrukturen verwenden, geben Sie bitte einen Hinweis.Entfernen aller Zeichen aus einer gegebenen Zeichenfolge

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(); 
} 

Gibt es einen schnelleren Weg dafür?

UPDATE: Ich möchte vielmehr eine neue Funktion wie Iterieren jedes Zeichen des String dann removeAllCharsInSecondStringFromFirstString(String S1, String S2)

+3

Müssen Sie es selbst implementieren? 'newStr = origStr.replaceAll (" [abcde] * "," ")' sieht ziemlich verlockend für mich aus ... –

+0

Ich bevorzuge es, es selbst zu implementieren, um ja zu üben. Ich habe 'replaceAll' gesehen. –

+1

Die Klasse von Guava [' CharMatcher'] (http://docs.guava-libraries.googlecode.com/git/javadoc/com/google/common/base/CharMatcher.html) ist für diese Art ausgezeichnet der Sache auch. – dimo414

Antwort

1

Mit Hinweisen löschen müssen versuchen, und Hilfe von Dimo ​​schrieb ich diese Lösung:

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

Gute Arbeit! Sie können es klarer oder einfacher finden, die ausgefallenen Java-Klassen zu überspringen und ein Array einfach zu verwenden. Sie können auf meine Antwort für weitere Informationen verweisen. –

+1

Beachten Sie, dass Sie kein 'char []' erstellen müssen, um die Zeichen in 'String' zu durchlaufen. Sie können 'String.charAt (i)' verwenden, um das 'char' am Index 'i' abzurufen, ohne dass ein separates 'char []' erstellt werden muss. – dimo414

+0

@ dimo414 Warum würden Sie HashMap over HashSet verwenden? –

2

schreiben, Sie String.indexOf(int) und eine Schleife verwenden könnte jeder Teilkette zwischen ch Intervallen hinzuzufügen. So etwas wie,

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

führen wird, möchte ich die Funktion zu' removeAllCharsInSecondStringFromFirstString (String S1, String S2) ' –

+2

[' String.indexOf (String, int) '] (http://docs.oracle.com/javase/8/docs/api/java/lang/String.html#indexOf-java .lang.String-int-) und 'p1 = p2 + s2.length();' Schließen Sie beim nächsten Mal alle relevanten Details in Ihre Frage ein. –

1

Wenn Sie wirklich wollen, dies selbst implementieren Sie eine Set verwenden können, die Sammlung von Zeichen enthalten, die Sie abstreifen wollen. Hier ist eine Vorlage, um loszulegen:

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

würde dies sicherstellen, dass die Reihenfolge in der Quellzeichenfolge nicht ändern würde? –

+1

@MonaJalal Da die Schleife die 'source'-Zeichenfolge der Reihe nach durchläuft, wird alles, was Sie dem 'StringBuilder' hinzufügen, in der gleichen Reihenfolge sein. – dimo414

0

Versuchen Sie, dies zu verwenden.

entfernen nicht alle Zahlenwert

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

Output geben Sie „343,333“

Wenn Sie in Zukunft numerischer und besonderer Wert diesen

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

Bitte lesen Sie die Kommentare unter dem Post! –