【问题标题】:Java: How to remove all occurrences of a set of letters stored as a string from another string?Java:如何从另一个字符串中删除所有出现的作为字符串存储的一组字母?
【发布时间】:2015-09-23 21:12:22
【问题描述】:

我正在试图弄清楚如何编写一个删除字母的方法

基于另一个字符串的字符串。该方法最终会像这样:

removeLetter("file", "fe")

唯一应该返回的是字符串“il”。到目前为止,我有这样的事情:

public class h 
{
 public static void main(String[] args)
 {
   String a="file";
   String b="fe";
   char letter;
   int i;
   int j;
   for (letter = 'a'; letter <= 'z'; letter++)
   {
      for (i=0; i < a.length()-1; i++)
      {
          for (j=0; j < b.length()-1; j++) // This is the loop i get stuck on
          {     
              char r = b.charAt(j);
              char s = a.charAt(i);
              if ( letter == r && letter == s);
                  System.out.print(r + " " + s);        
          }
      } 

   }         
 }
} 

我知道底部是错误的,但我不知道从哪里开始。

【问题讨论】:

  • 不是完全相同的副本,但从安迪的回答中可以看出,同样的原则也适用。还有stackoverflow.com/questions/13386107/….
  • 与正则表达式解决方案相比,您接受的答案对我来说似乎很愚蠢。我只能假设这是一项家庭作业,并且不允许您使用正则表达式,在这种情况下,您应该就代码寻求帮助。

标签: java


【解决方案1】:

你可以用正则表达式来做到这一点:

a.replaceAll("[" + b + "]", "")

这是通过构造一个像[fe] 这样的字符类,并将匹配的字符替换为空字符串来实现的。

当然,这有点小技巧,因为您可以轻松选择b,这样它就不会产生有效的正则表达式。但是,如果您知道 b 只会包含字母,那么这将起作用。

【讨论】:

  • 我认为你可以使用Pattern.escape 来确保字符类始终有效。
  • 嗯,如果将其插入字符类中,不确定是否会起作用。例如,它可能会构造类似\Qfe\E 的东西,如果你将它包装在[] 中,这将没有意义,不是吗?
  • 你是对的。我认为转义不需要在字符类中转义的字符不会有任何效果,但它似乎完全忽略了该字符。
【解决方案2】:

这是一个使用标志布尔值的非常简单的嵌套数组:

public static void main(String[] args) {

    String a = "file";
    String b = "f";
    String c = "";
    StringBuilder sb = new StringBuilder();
    boolean contains;

    for (int i = 0 ; i < a.length() ; i++){
        contains = false;
        for (int j = 0 ; j < b.length() ; j++){
            if (a.charAt(i) == b.charAt(j)) contains = true;
        }
        if (!contains) sb.append(a.charAt(i));
    }

    System.out.println(sb);

}

它检查第一个单词的每个字符和第二个单词的字符,如果两个字符都包含,则将标志更改为 true。

如果不是这样,则将第一个单词的char添加到新的String中,如果相反,则没有任何反应,我们继续第一个String的下一个char。

让我们删除这个单词的所有元音:Supercalifragilisticexpialidocious

String a = "Supercalifragilisticexpialidocious";
String b = "aeiou";

这是输出:

Sprclfrglstcxpldcs

【讨论】:

  • 您应该(可能,几乎)始终使用StringBuilder 在循环中累积字符串,以避免重复构造字符串的性能成本。
  • 这与我一直在学习的内容完全一致,对我来说完全有意义!非常感谢!
  • @AndyTurner 谢谢安迪,我确实改变了这一点,我今天也学到了一些东西:)
猜你喜欢
  • 2021-04-06
  • 1970-01-01
  • 2021-01-28
  • 1970-01-01
  • 1970-01-01
  • 2011-12-19
  • 1970-01-01
  • 2022-11-12
  • 2013-09-25
相关资源
最近更新 更多