【问题标题】:Removing all the characters from a given string从给定的字符串中删除所有字符
【发布时间】:2016-04-11 04:33:33
【问题描述】:

如何修改我的代码,以便删除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();
}

有没有更快的方法呢?

更新:我想写一个像removeAllCharsInSecondStringFromFirstString(String S1, String S2)这样的新函数

【问题讨论】:

  • 必须自己实现吗? newStr = origStr.replaceAll("[abcde]*", "") 看起来对我来说很诱人......
  • 我更喜欢自己实现它来练习是的。我见过replaceAll
  • Guava 的 CharMatcher 类也非常适合这类事情。
  • 据我了解,您必须将第一个字符串的每个字符与第二个字符串中的每个字符进行匹配,这将始终导致O(n*m)

标签: java string data-structures replace time-complexity


【解决方案1】:

而不是迭代String 的每个字符,您可以使用String.indexOf(int) 和循环在ch 间隔之间添加每个子字符串。类似的,

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

【讨论】:

  • 嗯,我想把函数改成removeAllCharsInSecondStringFromFirstString(String S1, String S2)
  • String.indexOf(String, int)p1 = p2 + s2.length(); 下次,在您的问题中包含所有相关详细信息。
【解决方案2】:

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

}

【讨论】:

  • 干得好!您可能会发现跳过花哨的 Java 类并简单地使用数组更清晰或更直接。您可以参考我的回答了解更多信息。
  • 请注意,您不需要构造char[] 来循环String 中的字符。您可以使用String.charAt(i) 在索引i 处获取char,而无需构造单独的char[]
  • @dimo414 为什么要使用 HashMap 而不是 HashSet?
  • @MonaJalal 这是一个错字。我会使用 HashSet 进行 O(1) .contains() 检查。
【解决方案3】:

如果你真的想自己实现这个,你可以使用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();
}

【讨论】:

  • 这能保证源字符串中的顺序不会改变吗?
  • @MonaJalal 由于循环按顺序遍历source 字符串,因此您添加到StringBuilder 的任何内容都将按相同顺序。
【解决方案4】:

尝试使用它。

去掉所有没有数值的

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

输出将为您提供“343.333”

如果将来您需要删除数字和特殊值,试试这个

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

【讨论】:

    猜你喜欢
    • 2016-01-02
    • 2011-06-23
    • 1970-01-01
    • 1970-01-01
    • 2010-11-04
    • 2010-12-04
    • 2011-12-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多