Ahmad Al-Sanie
Ahmad Al-Sanie

Reputation: 3785

How to replace the same character with deferent value?

I'm facing a problem in replacing character in a string with its index.

e.g I wanna replace every '?' With its index String:

"a?ghmars?bh?" -> will be "a1ghmars8bh11".

Any help is truly appreciated. P.s I need to solve this assignment today so I can pass it to my instructor. Thanks in adv.

So far I get to manage replacing the ? With 0; through this piece of code:

public static void main(String[] args) {

    String name = "?tsds?dsds?";

    String myarray[] = name.split("");
    for (int i = 0; i < myarray.length; i++) {

        name = name.replace("?", String.valueOf(i++));

    }
    System.out.println(name);

output:

0tsds0dsds0

it should be:

0tsds5dsds10

Upvotes: 0

Views: 100

Answers (5)

1&#39;hafs
1&#39;hafs

Reputation: 579

Check below code

 String string = "a?ghmars?bh?das?";

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

        Character r=string.charAt(i);

        if(r.toString().equals("?"))
           System.out.print(i);
        else
           System.out.print(r);

     }

Upvotes: 0

RAVI507
RAVI507

Reputation: 129

I think this may work i have not checked it.

public class Stack{
public static void main(String[] args) {
String name = "?tsds?dsds?";
int newvalue=50;
int countspecialcharacter=0;
for(int i=0;i<name.length();i++)
{
    char a=name.charAt(i);
    switch(a)
    {
        case'?':
        countspecialcharacter++;
        if(countspecialcharacter>1)
        {
            newvalue=newvalue+50;
        System.out.print(newvalue);
        }
        else
        {
                System.out.print(i);
        }
        break;
        default:
                System.out.print(a);
        break;
    }
}

} }

Upvotes: 0

Bohemian
Bohemian

Reputation: 424993

You are (more or less) replacing each target with the cardinal number of the occurrence (1 for 1st, 2 for 2nd, etc) but you want the index.

Use a StringBuilder - you only need a few lines:

StringBuilder sb = new StringBuilder(name);
for (int i = name.length - 1; i <= 0; i--)
    if (name.charAt(i) == '?')
        sb.replace(i, i + 1, i + "");

Note counting down, not up, allowing for the replacement index to be multiple digits, which if you counted up would change the index of subsequent calls (eg everything would get shuffled to the right by one char when the index of "?" was 10 or more).

Upvotes: 0

Holger
Holger

Reputation: 298143

For simple replace operations, String.replaceAll is sufficient. For more complex operations, you have to retrace partly, what this method does.

The documentation of String.replaceAll says that it is equivalent to

Pattern.compile(regex).matcher(str).replaceAll(repl)

whereas the linked documentation of replaceAll contains a reference to the method appendReplacement which is provided by Java’s regex package publicly for exactly the purpose of supporting customized replace operations. It’s documentation also gives a code example of the ordinary replaceAll operation:

Pattern p = Pattern.compile("cat");
Matcher m = p.matcher("one cat two cats in the yard");
StringBuffer sb = new StringBuffer();
while (m.find()) {
    m.appendReplacement(sb, "dog");
}
m.appendTail(sb);
System.out.println(sb.toString());

Using this template, we can implement the desired operation as follows:

String name = "?tsds?dsds?";

Matcher m=Pattern.compile("?", Pattern.LITERAL).matcher(name);
StringBuffer sb=new StringBuffer();
while(m.find()) {
    m.appendReplacement(sb, String.valueOf(m.start()));
}
m.appendTail(sb);
name=sb.toString();

System.out.println(name);

The differences are that we use a LITERAL pattern to inhibit the special meaning of ? in regular expressions (that’s easier to read than using "\\?" as pattern). Further, we specify a String representation of the found match’s location as the replacement (which is what your question was all about). That’s it.

Upvotes: 1

Cuzz
Cuzz

Reputation: 448

In previous answer wrong read question, sorry. This code replace every "?" with its index

String string = "a?ghmars?bh?das?";
while ( string.contains( "?" ) )
{
    Integer index = string.indexOf( "?" );
    string = string.replaceFirst( "\\?", index.toString() );
    System.out.println( string );
}

So from "a?ghmars?bh?das?" we got "a1ghmars8bh11das16"

Upvotes: 0

Related Questions