Mikxas
Mikxas

Reputation: 33

How to compress string on java without using map

I've recently started java and I want to compress a string like this:

Input:aaaaabbbbwwwccc Output:a5b4w3c3  
Input:aaabbccds       Output:a3b2c2ds  
Input:Abcd            Output:Abcd

The following code is what I have done but, it does not work.

public class CompressString {

    public static void main(String[] args) {
        String out = "";
        Scanner in = new Scanner(System.in);
        String input = in.next();
        int length = input.length();
        int counter = 1;
        if (length == 0) {
            System.out.println(" ");
        } else {
            for (int i = 0; i<length;i++){
                if (input.charAt(i)==input.charAt(i+1)){
                    counter++;
                }else {
                    if (counter == 1){
                        out = out+input.charAt(i-counter);
                    }else{
                        out = out+input.charAt(i-counter)+counter;
                    }
                }
                i++;
                counter = 1;
            }
            System.out.println(out.toString());
        }
    }
}

Upvotes: 1

Views: 223

Answers (2)

Vikash Madhow
Vikash Madhow

Reputation: 1344

The simplest program to do that would loop through each character in the string and check when the character is different from the previous seen one and, if so, add the last one and its count to the compressed string:

String input = "aaaaabbbbwwwccc";
StringBuilder compressed = new StringBuilder();

char last = 0;
int lastCount = 0;
for (int i = 0; i < input.length(); i++) {
  char c = input.charAt(i);
  if (last == 0 || c != last) {
    if (lastCount != 0) {
      compressed.append(last);
      if (lastCount > 1) {
        compressed.append(lastCount);
      }
    }
    last = c;
    lastCount = 1;
  } else {
    lastCount++;
  }
}

// take care of the last repeating sequence if any
if (lastCount > 0) {
  compressed.append(last);
  if (lastCount > 1) {
    compressed.append(lastCount);
  }
}

Upvotes: 4

Tim Biegeleisen
Tim Biegeleisen

Reputation: 522797

Here is a very compact way of doing this with a regex matcher along with a string buffer:

String input = "aaaaabbbbwwwccc";
Pattern r = Pattern.compile("(.)\\1{0,}");
Matcher m = r.matcher(input);
StringBuffer buffer = new StringBuffer();
while (m.find()) {
    m.appendReplacement(buffer, m.group(1) + m.group(0).length());
}
m.appendTail(buffer);
System.out.println(buffer.toString());

This prints:

a5b4w3c3

For an explanation, the above logic searches for the regex pattern (.)\1{0,}. This will match any single character, along with that same character occurring again possibly one or more times afterwards. It then replaces with just the single character followed by the count of the number of times it occurs.

Upvotes: 3

Related Questions