从左边删除字符,直到出现另一个字符。为此需要最好的方法

Removing characters from left until another character appears. Need best way for this

我需要编写一个字符串实用函数,我必须在其中删除字符,直到出现另一个字符。

这里是例子,

String inputString="a!a*!b7!123!a!";
String removeString="a!";

从 inputString 变量中每个字符的左侧开始,我必须检查它是否出现在 removeString 中。如果它存在,我必须删除直到另一个字符出现

在这种情况下,输出应该是 *!b7!123!a!.

为此我编写了 java 代码,但我正在寻找最好的方法,

有什么建议,

String inputString="a!a*!b7!123!a!";
String removeString="a!";
char[] charArray=inputString.toCharArray();
boolean flag=true;
StringBuilder stringBuilder=new StringBuilder();
for (int i=0;i<charArray.length;i++)
    {
    if (flag && removeString.contains((String.valueOf(charArray[i]))))
        {

        }
    else
        {
            flag=false;
            stringBuilder.append(String.valueOf(charArray[i]));
        }   
    }
    System.out.println(stringBuilder.toString());

String inputString="a!a*!b7!123!a!";
String removeString="a!";

Starting from the left of the inputString variable

Step 1: Get the first character from the inputString variable. It is 'a' and it is present in removeString so remove it. inputString="!a*!b7!123!a!"

Step 2: Get the second character of the step 1 result. It is '!' and it is present in removeString so remove it. inputString="a*!b7!123!a!"

Step 3: Get the third character of the step 2 result. It is 'a' and it is present in removeString so remove it. inputString="*!b7!123!a!"

Step 4: Get the fourth character of the step 3 result. It is '*' and it is NOT present in removeString so STOP.

Step 5: Final Output inputString="*!b7!123!a!"

The output should be the same evenn if removeString="!a"

根据主题

Removing characters from left until another character appears. Need best way for this

这是你想要的吗?

while(myString.isEmpty()==false && myString.startsWith(myStopToke)==false){
    myString=myString.substring(1);
} 

这将删除左边的每个字符,直到 myStopToken 出现在字符串

的开头

这里有活生生的例子。 http://goo.gl/foj82G

并且在这里你有轻微的修改以从输出中排除 stopToken http://goo.gl/TYVn1l

您可以使用 set 优化您的解决方案,并且只计算第一个交易品种的索引,而不是每次都更新字符串生成器:

private static String leftTrim(final String input, final String removeSymbols) {
    final Set<Integer> symbols = new HashSet<>(removeSymbols.length());
    removeSymbols.chars().forEach(c -> symbols.add(c));

    int idx = 0;
    while ((idx < input.length()) && symbols.contains((int) input.charAt(idx)))
        idx++;
    return input.substring(idx);
}

这是我的浓缩形式的解决方案。它的性能相当不错,虽然我没有详细分析 indexOf(Char c) 的性能开销。

  1. 在循环外初始化一个计数器,以便以后可以访问它
  2. 遍历 inputString 中的每个字符并将其与 removeString 中的任何字符匹配。
  3. 继续,直到在位置 j 找到第一个 non-match。
  4. Return 您的 inputString 从 j 到结尾(含)的子字符串。

    int j;
    for (j = 0; removeString.indexOf(inputString.charAt(j)) != -1; j++){}
    String result = inputString.substring(j);
    System.out.println(result);
    

我的代码与您的代码之间的主要区别在于,一旦找不到匹配项,该过程就会停止。您的代码从头到尾逐个字符地构建输出。这将带来显着的性能损失,具体取决于字符串的大小和数量 are.If 我正确理解您的要求,您只查看从左侧开始的字符,并且 stopping 一旦一个字符不再匹配,因此一旦没有更多匹配,任何解决方案也应该停止。