如何在不使用Java中的Replace()的情况下替换字符串中的char?

时间:2015-10-28 08:00:55

标签: java regex string char

我在完成这项任务时遇到了麻烦:

  

给定一个字符串,将第一个出现的'a'替换为“x”,将第二个出现的'a'替换为“xx”,将第三个出现的'a'替换为“xxx”。在第三次出现之后,再次用“x”,“xx”,“xxx”......等开始替换模式;但是,如果一个'a'后跟一行中超过2个其他'a'字符,那么在'a'之后不要再替换'a'字符。

     

不允许使用替换方法。

     

aTo123X(“ababba”)→“xbxxbbxxx”

     

aTo123X(“anaceeacdabnanbag”)→“xnxxceexxxcdxbnxxnbxxxg”

     

aTo123X(“aabaaaavfaajaaj”)→“xxxbxxxaaavfaajaaj”

     

aTo123X(“pakaaajaaaamnbaa”)→“pxkxxxxxxjxxaaamnbaa”

     

aTo123X(“aaaak”)→“xaaak”

我的代码的输出是包含的,x是添加但不是正确的x的数量。

public String aTo123X(String str) {
  /*
  Strategy: 
  get string length of the code, and create a for loop in order to find each individual part of the String chars.check for a values in string and take in pos of the a.
  if one of the characters is a
    replace with 1 x, however, there aren't more than 2 a's immediately following first a and as it keeps searching through the index, add more x's to the original string, but set x value back to 1 when x reaches 3.
    if one of characters isn't a,
    leave as is and continue string.
  */

  String xVal = "";
  String x = "x";
  String output = "";
  for (int i = 0; i < str.length(); i++){

    if( str.charAt(i) == 'a'){
       output += x; 
       str.substring(i+1, str.length());
    }
    output += str.charAt(i);
  }
  return output;
}

6 个答案:

答案 0 :(得分:3)

这是执行相同操作的代码。我已经对代码进行了评论,以解释它的作用

public class ReplaceChar {

    public static void main(String... args){
        String[] input =new String[]{"ababba","anaceeacdabnanbag","aabaaaavfaajaaj"};

        StringBuilder result = new StringBuilder();

        for (int i= 0; i < input.length;i++){
            result.append(getReplacedA(input[i]));
            result.append("\n");
        }

        System.out.println(result);

    }

    private static String getReplacedA(String withA){
        // stringBuilder for result
        StringBuilder replacedString = new StringBuilder();

        // counting the number of time char 'a' occurred in String for replacement before row of 'aaa'
        int charACount = 0;

        // get the first index at which more than two 'aa' occurred in a row
        int firstIndexOfAAA = withA.indexOf("aaa") + 1;

        // if 'aaa' not occurred no need to add the rest substring
        boolean addSubRequired = false;

        // if the index is 0 continue till end
        if (firstIndexOfAAA == 0)
            firstIndexOfAAA = withA.length();
        else
            addSubRequired = true;

        char[] charString = withA.toCharArray();

        //Replace character String[] array
        String[] replace = new String[]{"x","xx","xxx"};

        for(int i = 0; i < firstIndexOfAAA; i++){
                if (charString[i] == 'a'){
                    charACount++;
                charACount = charACount > 3 ? 1 : charACount ;
                // add the number x based on charCount
                replacedString.append(replace[charACount - 1]);
                }else{
                    replacedString.append(charString[i]);
                }
        }

        // if the String 'aaa' has been found previously add the remaining subString
        // after that index
        if (addSubRequired)
            replacedString.append(withA.substring(firstIndexOfAAA));

        // return the result
        return replacedString.toString();
    }

}

输出:

xbxxbbxxx
xnxxceexxxcdxbnxxnbxxxg
xxxbxxxaaavfaajaaj

编辑:一些改进你可以在getReplacedA()函数中为一些极端情况做出:

  1. 检查char&#39; a&#39;是否存在于String中,如果不是只返回字符串则无需再做任何事情。

  2. 使用IgnoreCase可以避免大写或小写的可能性。

答案 1 :(得分:1)

首先,字符串是不可变的,因此以下语句不执行任何操作

str.substring(i+1, str.length());

我想你想做:

str = str.substring(i+1, str.length());

然而,即使在修复之后,您的程序仍然无效。我无法理解你的解决方案。 1)你连续检测不到3个以上。 2)你没有附加“xx”或“xxx”

这是我的版本,到目前为止对我有用:

public static void main(String[] args) {
    System.out.println(aTo123X("ababba")); // "xbxxbbxxx"

    System.out.println(aTo123X("anaceeacdabnanbag")); // "xnxxceexxxcdxbnxxnbxxxg"

    System.out.println(aTo123X("aabaaaavfaajaaj")); // "xxxbxxxaaavfaajaaj"
}

public static String aTo123X(String str) {
    String output = "";
    int aOccurrence = 0;
    String[] xs = {"x", "xx", "xxx"};
    for (int i = 0; i < str.length(); ++i) {
        if (str.charAt(i) == 'a') {
            output += xs[aOccurrence % 3]; // append the x's depending on the number of a's we have seen, modulus 3 so that it forms a cycle of 3
            if (i < str.length() - 3 && str.charAt(i + 1) == 'a' && str.charAt(i + 2) == 'a' && str.charAt(i + 3) == 'a') {//if an 'a' is followed by more than 2 other 'a' characters in a row
                output += str.substring(i + 1);
                break;
            } else {
                ++aOccurrence; // increment the a's we have encountered so far
            }
        } else {
            output += str.charAt(i); // append the character if it is not a
        }
    }
    return output;
}

答案 2 :(得分:1)

public class NewClass {

    public static void main(String[] args) {
        System.out.println(aTo123X("ababba")); // "xbxxbbxxx"
        System.out.println(aTo123X("anaceeacdabnanbag")); // "xnxxceexxxcdxbnxxnbxxxg"
        System.out.println(aTo123X("aabaaaavfaajaaj")); //xxxbxxxaaavfaajaaj
    }

    public static String aTo123X(String str) {
        String output = "";
        int aCount = 0;
        int inRow = 0;
        for (int i = 0; i < str.length();) {
            if (str.charAt(i) == 'a') {
                if (inRow <= 1) {
                    inRow++;
                    aCount++;

                    if (aCount == 1) {
                        output += "x";
                    } else if (aCount == 2) {
                        output += "xx";
                    } else {
                        output += "xxx";
                        aCount = 0;
                    }

                    boolean multiple = ((i + 1) < str.length()) && (str.charAt(i + 1) == 'a')
                            && ((i + 2) < str.length()) && (str.charAt(i + 2) == 'a');

                    if (multiple) {
                        i++;
                        while (i < str.length()) {
                            output += str.charAt(i++);
                        }
                        return output;
                    }
                } else {
                    output += str.charAt(i);
                }
            } else {
                output += str.charAt(i);
                inRow = 0;
            }
            i++;
        }
        return output;
    }
}

答案 3 :(得分:1)

我在代码中以注释的形式指出了代码中的问题。

public String aTo123X(String str) {
    //You are not using xVal variable in your code, hence it's obsolete
    String xVal = "";
    //You don't need x variable as you can simply use string concatenation
    String x = "x";
    String output = "";

    for (int i = 0; i < str.length(); i++) {

        /**
         * Here, in "if" block you have not implmented any logic to replace the 2nd and
         * 3rd occurence of 'a' with 'xx' and 'xxx' respectively. Also, substring() returns
         * the sub-string of a string but you are not accepting that string anywhere, and 
         * you need not even use sub-string as "for" loop will cycle through all the
         * characters in the string. If use sub-string method you code will only process
         * alternative characters.
         */
         if( str.charAt(i) == 'a') {
             output += x; 
             str.substring(i+1, str.length());
         }

         /**
          * Because of this statement a's are also returned, because this statement gets 
          * in both scenarios, whether the current character of string is a or not.
          * But, this statement should get executed only when current character of the
          * string is 'a'. So, in terms of coding this statement gets executed no matter
          * "if" loop is executed or not, but it should get executed only when "if" loop
          * is not executed. So, place this statement in else block.
          */
          output += str.charAt(i);
    }
    return output;
}

我已经为你实现了逻辑。这是您的问题的解决方案,只需复制并运行它。它通过了所有指定的测试用例。

public String aTo123X(String str) {
    String output = "";
    int count = 1;
    boolean flag = true;

    for (int i = 0; i < str.length(); i++) {
        if(str.charAt(i) == 'a' && flag == true) {
            switch(count) {
                case 1: output += "x";
                        count++;
                        break;

                case 2: output += "xx";
                        count++;
                        break;

                case 3: output += "xxx";
                        count = 1;
                        break;
            }

            if ((str.charAt(i+1) == 'a' && str.charAt(i+2) == 'a') == true) {
                flag = false;
            }
        }
        else {
            output += str.charAt(i);    
        }
    }

    return output;
}

答案 4 :(得分:0)

我已经编辑了我的答案。这个是给出正确的解决方案:

public static void main (String[] args) throws InterruptedException, IOException, JSONException {
    System.out.println(aTo123X("ababba")); //xbxxbbxxx

    System.out.println(aTo123X("anaceeacdabnanbag")); //xnxxceexxxcdxbnxxnbxxxg

    System.out.println(aTo123X("aabaaaavfaajaaj")); //xxxbxxxaaavfaajaaj
}

public static String aTo123X(String str) {
    String x = "x";
    String xx = "xx";
    String xxx = "xxx";
    int a = 1;
    int brek = 0;

    String output = "";
    for (int i = 0; i < str.length(); i++) {
        if(str.charAt(i) == 'a' && a == 1) {
            output += x; 
            str.substring(i+1, str.length());
            a = 2;
            try {
                if(str.charAt(i+1) == 'a' && str.charAt(i+2) == 'a')
                    brek += 1;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else if(str.charAt(i) == 'a' && a == 2) {
            output += xx; 
            str.substring(i+1, str.length());
            a = 3;
            try {
                if(str.charAt(i+1) == 'a' && str.charAt(i+2) == 'a')
                    brek += 1;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else if(str.charAt(i) == 'a' && a == 3) {
            output += xxx; 
            str.substring(i+1, str.length());
            a = 1;

            try {
                if(str.charAt(i+1) == 'a' && str.charAt(i+2) == 'a')
                    brek += 1;
            } catch (Exception e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
        }
        else {
            output += str.charAt(i);
            brek = 0;
        }
        if(brek>0) {
            output += str.substring(i+1);
            break;
        }
    }
    return output;
}

答案 5 :(得分:0)

我使用地图存储替换位置

    public static void main(String[] args) {
        System.out.println(aTo123X("ababba"));//xbxxbbxxx
        System.out.println(aTo123X("anaceeacdabnanbag"));//xnxxceexxxcdxbnxxnbxxxg
        System.out.println(aTo123X("aabaaaavfaajaaj"));//xxxbxxxaaavfaajaaj
    }

    public static String aTo123X(String str){
        String res = "";
        int nthReplace = 1; //Integer to store the nth occurence to replace
        //Map to store [key == position of 'a' to replace]
        //[value == x or xx or xxx]
        Map<Integer, String> toReplacePos = new HashMap<>();
        //The loop to know which 'a' to replace
        for (int i = 0; i < str.length(); i++) {
            if(str.charAt(i) == 'a'){
                toReplacePos.put(i, nthReplace % 3 == 1 ? "x": (nthReplace % 3 == 2 ? "xx": "xxx"));
                nthReplace++;
                //Break if an 'a' is followed by more than 2 other 'a'
                try {
                    if((str.charAt(i+1) == 'a') 
                       && (str.charAt(i+2) == 'a') 
                       && (str.charAt(i+3) == 'a')){
                        break;                        
                    }                    
                } catch (StringIndexOutOfBoundsException e) {
                }
            } 
        }
        //Do the replace
        for (int i = 0; i < str.length(); i++) {
            res += toReplacePos.containsKey(i) ? toReplacePos.get(i) : str.charAt(i);                 
        }
        return res;
    }