【问题标题】:Removing select characters from a string从字符串中删除选择的字符
【发布时间】:2013-04-17 07:38:20
【问题描述】:

我是一名试图找出问题的学生。
我需要创建一个方法,从另一个字符串中删除在指定字符串中找到的任何字符。
所以如果String str = "hello world" and String remove = "eo" 该方法将返回"hll wrld"

我的解决方案设置的方式结果字符串被打印了很多次,这是我不想要的。是否有一个简单的解决方法或者我必须重新设计该方法?

class StringStuff{
        public static void main (String [] args){

        String str = "This is a string that needs to be changed";
        String remove = "iaoe";

        System.out.println(removeChars(str, remove));

        }

    public static String removeChars(String str, String remove){
        String newStr = "";
        for(int i=0;i<remove.length();i++){
            for(int j=0; j<str.length(); j++){
                if(str.charAt(j)!=remove.charAt(i)){
                    newStr = newStr+str.charAt(j);
                }
            }
        }        
        return newStr;
    }
}

更新

感谢您的回复,我想出了另一种受您提供的解决方案启发的“新”方式。

public static String removeChar(String str, String remove){
      String newStr = "";
      boolean match = false;
      for(int i = 0; i<str.length(); i++){
         for(int j=0; j<remove.length(); j++){
            if(str.charAt(i) == remove.charAt(j))
               match = true;
         }
         if(match == false)
            newStr = newStr + str.charAt(i);
         match = false;
      }
      return newStr;
   }

【问题讨论】:

  • 我想你想切换循环的顺序。
  • @squiguy:仅此一项并不能修复错误。
  • @jlordo 我知道。这就是我在评论中指出的原因。

标签: java string methods


【解决方案1】:

此答案假定不允许使用 replaceXXX 方法。

首先,for 循环是错误的。第一个循环需要遍历原来的String

下一个问题是嵌套的for 循环将一个字符附加到remove 字符串的每个 字符的新String,前提是这些字符不匹配。这会产生hllo worldhell wrld

因此,解决方案不是迭代 remove StringindexOf 用于字符检查。

public static String removeChars(String str, String remove) {
   String newStr = "";
   for (int i = 0; i < str.length(); i++) {
      if (remove.indexOf(str.charAt(i)) == -1) {
       newStr = newStr + str.charAt(i);
      }
   }

   return newStr;
}

可以通过使用StringBuilder 而不是String for newStr 来进行进一步的改进。

【讨论】:

    【解决方案2】:

    这样就可以了:

    return str.replaceAll("[" + remove + "]", "");
    

    只要remove 不包含任何必须在正则表达式字符类中转义的字符。

    【讨论】:

    • Pattern.quote。我会将其重写为str.replaceAll(String.format("[%s]",Pattern.quote(remove)), "")
    • @A.R.S.:没用。 \Q\E 将在字符类中并失去其特殊意义。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-19
    • 2016-07-26
    • 2013-09-18
    • 2011-11-22
    相关资源
    最近更新 更多