user5129558
user5129558

Reputation:

How to replace a char in a string without using Replace() in Java?

I've been having trouble with this assignment:

Given a string, replace the first occurrence of 'a' with "x", the second occurrence of 'a' with "xx" and the third occurrence of 'a' with "xxx". After the third occurrence, begin the replacement pattern over again with "x", "xx", "xxx"...etc.; however, if an 'a' is followed by more than 2 other 'a' characters in a row, then do not replace any more 'a' characters after that 'a'.

No use of the replace method is allowed.

aTo123X("ababba") → "xbxxbbxxx"

aTo123X("anaceeacdabnanbag") → "xnxxceexxxcdxbnxxnbxxxg"

aTo123X("aabaaaavfaajaaj") → "xxxbxxxaaavfaajaaj"

aTo123X("pakaaajaaaamnbaa") → "pxkxxxxxxjxxaaamnbaa"

aTo123X("aaaak") → "xaaak"

My code's output is with a's included, x's added but not the correct amount of x's.


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

Upvotes: 3

Views: 8914

Answers (6)

Shivam
Shivam

Reputation: 649

I have edited my answer. This one is giving the correct solution:

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

Upvotes: 0

user2466595
user2466595

Reputation:

I am pointing out problems in your code in form of comments in the code itself.

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

I have implemented the logic for you. Here is Solution for your problem, just copy and run it. It passes all the specified test cases.

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

Upvotes: 1

Ankur Anand
Ankur Anand

Reputation: 3904

This is the code that does the same. I've commented the code to explain what it does

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

}

Output:

xbxxbbxxx
xnxxceexxxcdxbnxxnbxxxg
xxxbxxxaaavfaajaaj

EDIT : Some Improvement You can make for some corner cases in the getReplacedA() function:

  1. Check if char 'a' is there or not in the String if not just return the String No need to do anything further.

  2. Use IgnoreCase to avoid the uppercase or lowercase possibility.

Upvotes: 3

Aroniaina
Aroniaina

Reputation: 1252

I use Map To store where to replace

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

Upvotes: 0

Soley
Soley

Reputation: 1776

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

Upvotes: 1

Bon
Bon

Reputation: 3103

Firstly, string is immutable, so the below statement does nothing

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

I guess you wanted to do:

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

However, even after fix that, your program still doesn't work. I can't really comprehend your solution. 1) you are not detecting more than 3 a's in a row. 2) you are not appending "xx" or "xxx" at all

Here is my version, works for me so far:

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

Upvotes: 1

Related Questions