user6000220
user6000220

Reputation:

How do I count repetitive/continuous appearance of a character in String(When I don't know index of start/end)?

So if I have 22332, I want to replace that for BEA, as in mobile keypad.I want to see how many times a digit appear so that I can count A--2,B--22,C--222,D--3,E--33,F--333, etc(and a 0 is pause).I want to write a decoder that takes in digit string and replaces digit occurrences with letters.example : 44335557075557777 will be decoded as HELP PLS.

This is the key portion of the code:

public void printMessages() throws Exception {
 File msgFile = new File("messages.txt");

 Scanner input = new Scanner(msgFile);

while(input.hasNext()) {
  String x = input.next();
  String y = input.nextLine();
  System.out.println(x+":"+y);
}

It takes the input from a file as digit String.Then Scanner prints the digit.I tried to split the string digits and then I don't know how to evaluate the appearance of the mentioned kind in the question.

  for(String x : b.split(""))
       System.out.print(x);
gives: 44335557075557777(input from the file).

I don't know how can I call each repetitive index and see how they formulate such pattern as in mobile keypad.If I use for loop then I have to cycle through whole string and use lots of if statements. There must be some other way.

Upvotes: 3

Views: 76

Answers (1)

Adrian Shum
Adrian Shum

Reputation: 40036

Another suggestion of making use of regex in breaking the encoded string.

By making use of look-around + back-reference makes it easy to split the string at positions that preceding and following characters are different.

e.g.

String line = "44335557075557777";
String[] tokens = line.split("(?<=(.))(?!\\1)");
// tokens will contain ["44", "33", "555", "7", "0", "7", "555", "7777"]

Then it should be trivial for you to map each string to its corresponding character, either by a Map or even naively by bunch of if-elses


Edit: Some background on the regex

(?<=(.))(?!\1)

(?<=   )         : Look behind group, which means finding 
                   something (a zero-length patternin this example)
                   preceded by this group of pattern
    ( )          : capture group #1
     .           : any char
                 : zero-length pattern between look behind and look
                   ahead group
       (?!  )    : Negative look ahead group, which means finding
                   a pattern (zero-length in this example) NOT followed
                   by this group of pattern
          \1     : back-reference, whatever matched by 
                   capture group #1

So it means, find any zero-length positions, for which the character before and after such position is different, and use such positions to do splitting.

Upvotes: 3

Related Questions